实际上spring boot默认的日志格式(logging.pattern)可以满足大部分场景,但有些场景需要做日志的链路追踪,所以我们就需要在日志文件中,打印特定的“日志ID”来满足这个场景。
(比如在接收到请求的时候,put一个日志ID,这样从请求到响应的完整流程日志,都可以通过这一个日志ID过滤出来)
想要在日志中打印log_id,就需要修改pattern。
但是如果引入logback.xml,就会破坏spring boot原本的日志切割+日志压缩功能(虽然手写一个脚本也不难),所以直接在yml中修改“logging.pattern”的配置,成本最低且最有效。
logging:
pattern:
console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) - %clr([%t]){faint} %X{log_id} %clr(%logger{39}){cyan} %clr(:){faint} %m%n%wEx"
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} %5p - [%t] %X{log_id} %logger{39} : %m%n%wEx"
↑↑↑ 这里的pattern是完全基于spring boot默认格式,做了一点点修改,仅仅是加入了“%X{log_id}”而已。
注意console和file的不同,就是console有高亮配置,file没有。
MDC实例
for (int i = 0; i < 5; i++) {
new Thread(() -> {
MDC.put("log_id", IdUtil.objectId());
log.debug("线程测试 threadId: {}", Thread.currentThread().getId());
MDC.remove("log_id");
}).start();
}
↑↑↑ 这个demo就能检验出我们配置的log_id是否生效了。