【问题标题】:log4j2 new objectMessageAsJsonObject problemlog4j2新objectMessageAsJsonObject问题
【发布时间】:2021-02-08 20:07:43
【问题描述】:

我遇到了此配置的问题,我正在尝试确定错误是否来自 json 序列化(使用 lombokjackson)、与库的兼容性或别的东西。 我正在尝试在 message 字段中使用 log4j2 将自定义对象编写为 json,我读到 objectMessageAsJsonObject 会帮助我,这是我的 logj2.xml

<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>

这是我的自定义对象

@Builder
@AllArgsConstructor
public class EventLog {

  private String service;
  private String method;
  private String event;
  private String eventType;
  private String level;
  private Object information;
  private Long elapsedTime;
  private String sessionId;
  private String identification;
  private String code;
  private String message;
}

我的 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":"EventLog(service=com.controllers.ControlListController, method=verifyControlList, event=null, eventType=REQUEST, level=LEVEL_001, information=[Ljava.lang.Object;@5fa99897, elapsedTime=1603722209217, sessionId=null, identification=null, code=null, message=null)","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"}

预期结果

{"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()));
  }

而且 json 从未显示,请对此有所帮助

【问题讨论】:

    标签: java json logging log4j2 spring-webflux


    【解决方案1】:

    在类似的设置中遇到了类似的问题 - 将 org.springframework.cloud 降级到 Hoxton.SR6(和 org.springframework.boot 到 2.3.0.RELEASE)解决了它。

    【讨论】:

    • 感谢您的回答,但在降级这些依赖项时遇到了同样的问题。用 2.4.2 尝试了 org.springframework.boot 和 2020.0.1 org.springframework.cloud 还是不行
    猜你喜欢
    • 2021-06-14
    • 2022-01-16
    • 1970-01-01
    • 2020-12-02
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多