logback内置的日志字段还是比较少,如果我们需要打印有关业务的更多的内容,包括自定义的一些数据,需要借助logback MDC机制,MDC为“Mapped Diagnostic Context”(映射诊断上下文),即将一些运行时的上下文数据通过logback打印出来;此时我们需要借助org.sl4j.MDC类。
MDC类基本原理其实非常简单,其内部持有一个InheritableThreadLocal实例,用于保存context数据,MDC提供了put/get/clear等几个核心接口,用于操作ThreadLocal中的数据;ThreadLocal中的K-V,可以在logback.xml中声明,最终将会打印在日志中。
Java代码
- MDC.put("userId",1000);
那么在logback.xml中,即可在layout中通过声明“%X{userId}”来打印此信息。
在使用MDC时需要注意一些问题,这些问题通常也是ThreadLocal引起的,比如我们需要在线程退出之前清除(clear)MDC中的数据;在线程池中使用MDC时,那么需要在子线程退出之前清除数据;可以调用MDC.clear()方法。
今天想在 log 里加上当前机器的 ip,找了一些文档,logback 支持 MDC(Mapped Diagnostic Contexts),可以很容易的把 ip 放到 log 中。
方法:
1. 先在代码中加上一行 MDC.put(
"ip", InetAddress.getLocalHost().getHostAddress())
2. 然后在 logback 的 pattern 中加上 %X{ip} 即可