跳到主要内容

java springboot log

java的log体系实在太混乱了, 不花费时间熟悉很容易一团乱, 其实只是为了打印个日志, 根本不需要了解那么多.

  • slf4j是java log框架的facade门面, 并不具备真实的log功能, 背后可以是logback, 也可以是log4j2.
  • springboot 的 starter 默认自带 logback, 直接就可以使用, 也接受logback.xml配置.
  • 如果要使用 log4j2, 需要 exclude logback的依赖, 额外 import log4j2才行
  • logback需要使用配置 logback.xml, spring推荐使用spring-logback.xml
  • log4j2 需要使用配置log4j2.xml, spring推荐使用spring-log4j2.xml

跨线程传递mdc

了解ttl-executor的原理, 然后再看ttl log4j2的代码就清楚了, ttl log4j2里的threadlocal就是ttl executor.

ttl-log4j2的依赖, 只需要import即可, 自动替换了log4j2的threadlocal context, mdc默认就是ttl threadlocal, 因此mdc可以在线程间异步调用.

ttl-logback, 则需要添加 javaagent, 配置xml, 才能自动带上异步的mdc.

ttl executor是需要与ttl threadlocal同时结合才能生效的.

如果要每次线程池都自动使用ttl executor, 可以在线程池配置里, 返回经过ttl wrap的executor, 同时所有的threadlocal都是用ttl threadlocal. 这两步操作后, 就可以实现异步线程自动继承父线程的线程threadlocal参数了.

参考

https://howtodoinjava.com/spring-boot/spring-boot-log4j2-config/

https://www.baeldung.com/log4j2-print-thread-info

https://www.baeldung.com/spring-boot-logback-log4j2

https://stackoverflow.com/questions/8602201/can-i-use-log4j-xml-configuration-for-slf4j-and-logback

https://www.baeldung.com/spring-boot-logback-log4j2

https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/howto-logging.html#:~:text=Spring%20Boot%20supports%20Log4j%202,in%20addition%20to%20Log4j%202.

https://github.com/alibaba/transmittable-thread-local#-user-guide

https://github.dev/oldratlee/log4j2-ttl-thread-context-map

https://github.dev/ofpay/logback-mdc-ttl

https://www.cnblogs.com/54chensongxia/p/12015443.html