Spring boot 日志记录-如何删除跟踪日志前缀

问题描述 投票:0回答:1
1.Message LOG
{"@timestamp":"2023-12-18T22:36:22.449Z","severity":"INFO","service":"mopservice-jcr-svc","traceId":"afa32548086d2994","spanId":"afa32548086d2994","user-id":"","iv-user":"","customer-number":"","exportable":"","pid":"1","thread":"http-nio-8443-exec-1","class":"o.a.c.m.jmx.InstrumentationManagerImpl","message":"registering MBean org.apache.cxf:bus.id=cxf619002012,type=Performance.Counter.Server,service=\"{http://www.canadapost.ca/ws/payment/methodsofpayment/soap/2017/10}MethodsOfPaymentPortTypeService\",port=\"MethodsOfPaymentPortTypePort\",operation=\"GetAllowedMethodsOfPayment\": org.apache.cxf.management.counters.ResponseTimeCounter@99c7fd6"}
2.TRACE LOG - message field contains trace information without any actual message.
{"@timestamp":"2023-12-18T22:36:21.076Z","severity":"INFO","service":"mopservice-jcr-svc","traceId":"afa32548086d2994","spanId":"-5697962974162517179","user-id":"","iv-user":"","customer-number":"","exportable":"","pid":"1","thread":"http-nio-8443-exec-1","class":"c.c.s.config.sleuth.LoggingSpanReporter","message":"{\"traceId\":\"afa32548086d2994\",\"parentId\":\"57583fd122326bb7\",\"id\":\"b0ecc4dd35b70345\",\"kind\":\"CLIENT\",\"name\":\"micrometer://timer:get-allowed-methods-of-payment-time?action=start\",\"timestamp\":1702938981069686,\"duration\":6630,\"localEndpoint\":{\"serviceName\":\"micrometer://timer:get-allowed-methods-of-payment-time?action=start\",\"ipv4\":\"10.129.6.120\"},\"tags\":{\"camel.client.endpoint.url\":\"micrometer://timer:get-allowed-methods-of-payment-time?action=start\",\"camel.client.exchange.id\":\"CBE3D7CC933D03A-0000000000000001\",\"camel.client.exchange.pattern\":\"InOut\"}}"}

这些是我的 springboot 应用程序中的应用程序日志。在第一个日志中,有实际的消息,第二个日志只是一个跟踪日志,其中消息内部有跟踪信息。

只要有消息,第一行就可以。但第二行我只想打印消息内的跟踪日志(以 { taceId 开头)。我将在下面发布我的 logback 配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <!-- Example for logging into the build folder of your project -->

    <!-- You can override this to have a custom pattern -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %-5level [${springAppName},%X{traceId:-},%X{spanId:-}] %clr([%X{iv-user:-},%X{user-id:-},%X{customer-number:-}]) %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!-- Appender to log to console -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
            <immediateFlush>true</immediateFlush>
        </encoder>
    </appender>

    <appender name="ASYNC-CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="CONSOLE"/>
        <!-- do not discard any messages -->
        <discardingThreshold>0</discardingThreshold>
        <!-- size of the blocking queue -->
        <queueSize>500</queueSize>
    </appender>

    <!-- Appender to log to file in a JSON format -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "traceId": "%X{traceId:-}",
                        "spanId": "%X{spanId:-}",
                        "user-id":"%X{user-id}",
                        "iv-user":"%X{iv-user}",
                        "customer-number":"%X{customer-number}",
                        "exportable": "%X{spanExportable:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
                <stackTrace>
                    <throwableConverter
                            class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                        <maxDepthPerThrowable>10</maxDepthPerThrowable>
                        <maxLength>2048</maxLength>
                        <shortenedClassNameLength>32</shortenedClassNameLength>
                        <exclude>sun\.reflect\..*\.invoke.*</exclude>
                        <exclude>net\.sf\.cglib\.proxy\.MethodProxy\.invoke</exclude>
                        <rootCauseFirst>true</rootCauseFirst>
                    </throwableConverter>
                </stackTrace>
            </providers>
            <immediateFlush>false</immediateFlush>
        </encoder>
    </appender>

    <appender name="ASYNC-STDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="STDOUT"/>
        <!-- do not discard any messages -->
        <discardingThreshold>0</discardingThreshold>
        <!-- size of the blocking queue -->
        <queueSize>500</queueSize>
    </appender>

    <if condition='!isDefined("LOG_LEVEL")'>
        <then>
            <property name="LOG_LEVEL" value="INFO" />
        </then>
    </if>

    <root level="${LOG_LEVEL}">
        <if condition='isDefined("ELK_OUTPUT")'>
            <then>
                <appender-ref ref="ASYNC-STDOUT" />
            </then>
            <else>
                <appender-ref ref="ASYNC-CONSOLE" />
            </else>
        </if>
    </root>
</configuration>

这是我的logback-spring xml,我想在其中自定义STDOUT模式。在 %message 中,我已经获取了 JSON 格式的跟踪信息,并且“net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder”类正在将 json 转换为 json,此时反斜杠进入消息的每个子字段。
所以这里的要求是删除跟踪消息的前缀,以便它只打印 %message,它是 JSON。
并且还删除 JSON 编码器,这样我就不会在每个子字段中插入这些反斜杠。

我厌倦了删除在编译时给我错误的类,并且还尝试提供核心编码器,这在编译时也给出了 logback 配置错误。

我没有找到一种方法来删除 c.c.s.config.sleuth.LoggingSpanReporter 类生成的日志的所有前缀。

请建议一种方法,以便在 LoggingSpanReporter 有日志行时仅打印跟踪并删除 JSON Encoder 类。我想要的只是 JSON 格式,以便 Kibana 解析为子字段。

java spring-boot logback spring-logback
1个回答
0
投票
    <appender name="TRACE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%message%n</pattern>
<charset>utf8</charset>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
<appender name="ASYNC-TRACE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="TRACE"/>
<!-- do not discard any messages -->
<discardingThreshold>0</discardingThreshold>
<!-- size of the blocking queue -->
<queueSize>500</queueSize>
</appender>
<!--Appends Custom pattern for Trace Logs-->
<logger name="com.cpg.springboot.config.sleuth.LoggingSpanReporter" level="INFO" additivity="false">
<appender-ref ref="ASYNC-TRACE"/>
</logger>

这解决了我的模式问题,Kibana 能够解析 JSON 并映射到字段中。此附加程序的目标是 Sleuth.LoggingSpanReporter 类生成的日志 并应用该模式并仅打印 %message 内的跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.