开篇说明
- 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。
- 技术栈 >> 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]-
实现步骤
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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>
<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();
}
};
}
}
相关博客