Java log4j2新对象消息AsJSonObject问题
我在这个配置中遇到了一个问题,我正在尝试确定错误是否来自json序列化(使用lombok和jackson)、与库的兼容性或其他方面。 我试图在消息字段中用log4j2将一个自定义对象写为json,我读到objectMessageAsJsonObject将帮助我,这是我的logj2.xmlJava log4j2新对象消息AsJSonObject问题,java,json,logging,log4j2,spring-webflux,Java,Json,Logging,Log4j2,Spring Webflux,我在这个配置中遇到了一个问题,我正在尝试确定错误是否来自json序列化(使用lombok和jackson)、与库的兼容性或其他方面。 我试图在消息字段中用log4j2将一个自定义对象写为json,我读到objectMessageAsJsonObject将帮助我,这是我的logj2.xml <Configuration status="INFO"> <Appenders> <Console name="Consol
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<JSONLayout properties="true" compact="true" eventEol="true" objectMessageAsJsonObject="true">
<KeyValuePair key="guid" value="${ctx:guid}"/>
<KeyValuePair key="ip" value="${ctx:x-forwarded-for}"/>
<KeyValuePair key="user-agent" value="${ctx:user-agent}"/>
<KeyValuePair key="host" value="${ctx:host}"/>
</JSONLayout>
</Console>
</Appenders>
<Loggers>
<Logger name="com" level="debug">
<AppenderRef ref="Console"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
我的pom依赖项
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
预期结果
{"instant":{"epochSecond":1603722213,"nanoOfSecond":172284000},"thread":"reactor-http-nio-3","level":"DEBUG","loggerName":"com.reactive.aspect.LoggableAspect","message":"{custom object as json}","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","contextMap":{"X-B3-SpanId":"aadb80928473e529","X-B3-TraceId":"5f96dbe1d99a094aaadb80928473e529","X-Span-Export":"true","host":"localhost:8080","spanExportable":"true","spanId":"aadb80928473e529","traceId":"5f96dbe1d99a094aaadb80928473e529","user-agent":"PostmanRuntime/7.26.5"},"threadId":28,"threadPriority":5,"guid":"${ctx:guid}","ip":"${ctx:x-forwarded-for}","user-agent":"PostmanRuntime/7.26.5","host":"localhost:8080"}
我试图写日志的方式是通过方法的一个方面
@Around("@annotation(loggable)")
public Object logMethodEntryExit(ProceedingJoinPoint pjp, Loggable loggable) throws Throwable {
long start = System.currentTimeMillis();
String className = pjp.getSignature().getDeclaringTypeName();
String methodName = pjp.getSignature().getName();
Object information = pjp.getArgs();
log.debug(EventLog.builder()
.method(methodName)
.service(className)
.elapsedTime(start)
.information(information)
.eventType(REQUEST.name())
.level(loggable.level().name())
.build());
Mono<Object> result = (Mono<Object>) pjp.proceed();
long elapsedTime = System.currentTimeMillis() - start;
return result.doOnNext(element -> log.debug(EventLog.builder()
.method(methodName)
.service(className)
.elapsedTime(elapsedTime)
.information(element)
.eventType(RESPONSE.name())
.level(loggable.level().name())
.build()));
}
周围(“@注释(可记录)”)
公共对象logMethodEntryExit(ProceedingJoinPoint pjp,Loggable Loggable)抛出Throwable{
长启动=System.currentTimeMillis();
字符串className=pjp.getSignature().getDeclaringTypeName();
String methodName=pjp.getSignature().getName();
对象信息=pjp.getArgs();
调试(EventLog.builder()
.method(methodName)
.服务(类名)
.elapsedTime(开始)
.信息(信息)
.eventType(REQUEST.name())
.level(loggable.level().name())
.build());
Mono结果=(Mono)pjp.procedure();
long elapsedTime=System.currentTimeMillis()-开始;
返回result.doOnNext(element->log.debug(EventLog.builder())
.method(methodName)
.服务(类名)
.elapsedTime(elapsedTime)
.信息(要素)
.eventType(RESPONSE.name())
.level(loggable.level().name())
.build());
}
json从未显示过,请对此提供一点帮助。在类似设置中遇到类似问题-将org.springframework.cloud降级到Hoxton.SR6(并将org.springframework.boot升级到2.3.0.RELEASE)解决了它。在类似设置中遇到类似问题-将org.springframework.cloud降级到Hoxton.SR6(和org.springframework.boot至2.3.0.RELEASE)解决了。感谢您的回答,但降级这些依赖项时遇到了相同的问题。尝试了org.springframework.boot和2020.0.1 org.springframework.cloud的2.4.2版本,但仍然不起作用。感谢您的回答,但降级这些依赖项时遇到了相同的问题。尝试了org.springframework.boot和2020.0.1或更高版本的2.4.2版本g、 springframework.cloud仍然不起作用
{"instant":{"epochSecond":1603722213,"nanoOfSecond":172284000},"thread":"reactor-http-nio-3","level":"DEBUG","loggerName":"com.reactive.aspect.LoggableAspect","message":"{custom object as json}","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","contextMap":{"X-B3-SpanId":"aadb80928473e529","X-B3-TraceId":"5f96dbe1d99a094aaadb80928473e529","X-Span-Export":"true","host":"localhost:8080","spanExportable":"true","spanId":"aadb80928473e529","traceId":"5f96dbe1d99a094aaadb80928473e529","user-agent":"PostmanRuntime/7.26.5"},"threadId":28,"threadPriority":5,"guid":"${ctx:guid}","ip":"${ctx:x-forwarded-for}","user-agent":"PostmanRuntime/7.26.5","host":"localhost:8080"}
@Around("@annotation(loggable)")
public Object logMethodEntryExit(ProceedingJoinPoint pjp, Loggable loggable) throws Throwable {
long start = System.currentTimeMillis();
String className = pjp.getSignature().getDeclaringTypeName();
String methodName = pjp.getSignature().getName();
Object information = pjp.getArgs();
log.debug(EventLog.builder()
.method(methodName)
.service(className)
.elapsedTime(start)
.information(information)
.eventType(REQUEST.name())
.level(loggable.level().name())
.build());
Mono<Object> result = (Mono<Object>) pjp.proceed();
long elapsedTime = System.currentTimeMillis() - start;
return result.doOnNext(element -> log.debug(EventLog.builder()
.method(methodName)
.service(className)
.elapsedTime(elapsedTime)
.information(element)
.eventType(RESPONSE.name())
.level(loggable.level().name())
.build()));
}