springboot 默认日志框架logback日志跟踪以及子线程的处理情况

开篇说明
  • 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。
  • 技术栈 >> java
  • 邮箱 >> 15673219519@163.com
描述
  • 在每条日志前添加一个随机字符串并且确保同一个请求的字符串相同。如下:c6019df137174d2b98631474db4156b7为此次请求的标识。通过次标识可以查询到所有该请求的日志信息;并且其下的子线程日志中包含父线程的日志ID。这样便于日志查看
// 主线程
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:209]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:214]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:223]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7]-[2022-07-21 13:31:58:224]-[http-nio-8803-exec-4]-

// 子线程
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:204]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:205]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:209]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:214]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:223]-[http-nio-8803-exec-4]-
[traceID:c6019df137174d2b98631474db4156b7-c8i0mk29]-[2022-07-21 13:31:58:224]-[http-nio-8803-exec-4]-
实现步骤
  • logback-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- INFO -->
    <appender name="INFO_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern><![CDATA[%n[traceId-%X{traceId}] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [Thread: %t] [%p] [Class:%c >> Method: %M:%L ]:%m]]></pattern>
        </encoder>
        <file>logs/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/info_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1024MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- ERROR -->
    <appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern><![CDATA[%n[traceId-%X{traceId}] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [Thread: %t] [%p] [Class:%c >> Method: %M:%L ]:%m]]></pattern>
        </encoder>
        <file>logs/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/error_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1024MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name="com.xxx.xxx" level="DEBUG" additivity="false">
        <appender-ref ref="INFO_LOG_FILE"/>
        <appender-ref ref="ERROR_LOG_FILE"/>
    </logger>

    <root level="ERROR">
        <appender-ref ref="ERROR_LOG_FILE"/>
    </root>
</configuration>
  • LogMDCFilter.java 生成随机字符串用作日志跟踪的ID, 在logback-test.xml中通过 %X{traceId}使用。
public class LogMDCFilter implements Filter {
    public static final String UNIQUE_ID_NAME = "traceId";
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        MDC.put(UNIQUE_ID_NAME, UUID.randomUUID().toString().replace("-", ""));
        try {
            chain.doFilter(request, response);
        } finally {
            MDC.remove(UNIQUE_ID_NAME);
        }
    }
}
  • MdcTaskDecorator.java 在原有的线程日志ID中添加一个8位的随机字符串,标识子线程
public class MdcTaskDecorator implements TaskDecorator{
    @Override
    public Runnable decorate(Runnable runnable) {
        Map<String, String> contextMap = MDC.getCopyOfContextMap();
        return () -> {
            try {
                if (contextMap != null) {
                    String childMDCId = UUID.randomUUID().toString().replace("-", "").substring(0,8);
                    String UNIQUE_ID_NAME = contextMap.get(LogMDCFilter.UNIQUE_ID_NAME) + "-" + childMDCId;
                    contextMap.put(LogMDCFilter.UNIQUE_ID_NAME, UNIQUE_ID_NAME);
                    MDC.setContextMap(contextMap);
                }
                runnable.run();
            } finally {
                MDC.clear();
            }
        };
    }
}
相关博客
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放码过来_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值