关于MDC的使用,可以结合filter一块使用,将需要串联的上下文的关键信息,通过header进行传递,然后通过配置%X{userId}将信息打印出来。
MDC.put("userId", userId);
httpResponse.setHeader("userId", userId);
关于转义符的描述
转换符 | 描述 |
c | 调用日志事件的所在记录器的名字,如一个logger的名字是my.test.bbb.ccc,调用的是WARN级别的日志输出,那么输出的是输出my.test.bbb.ccc,可以在其右边指定了精度,如%c{2}那么输出的是bbb.ccc |
C | 调用日志事件的所在的类名,和c转换符一样,可以在右边指定宽度,如%C{2}输出%C{2} |
d | 日志调用所发生的时间,日期格式在其后跟着的大括号内的格式指定如%d{yyyy-MM-dd HH:mm:ss},我现在输出的结果是2011-07-11 21:05:22,推荐使用的是log4j本身提供的日期格式,如%d{ISO8601},%d{ABSOLUTE},%d{DATE} |
F | 所处所在文件名,如上面说C转换符的例子,输出结果是LayoutTest.java |
l | 是的日志事件发生的位置信息,这个和虚拟机的实现有点关系,一般境况下能得到类,方法,行数源文件等信息, |
L | 只是输出触发日志事件代码所在的行号,性能损耗会小很多。 |
m | 显示应用给日志提供的其他信息,如消息。logger.warn("Message 2");那么%m将得到的是Message 2 |
M | 输出调用者所在的方法名 |
n | 换行,和\r \r\n有相同功能,能识别系统的换行符,自动转换成\r或者\r\n,log4j推荐使用这个转换符,而不是\r或者\r\n |
p | 输出调用的日志的级别,如我是调用logger.debug方法,那么级别就是debug |
r | 输出自应用启动后第一次调用logger的日志输出方法,到输出该log信息耗费的毫秒数 |
t | 输出所在线程的名字 |
x | 输出产生的日志事件的线程的NDC(嵌套诊断上下文) |
X | 输出与生成的日志事件的线程关联的MDC(映射诊断上下文)。X转换符括号之间放置了一个key,就像在%X {clientNumber}中的clientNumberkey 一样。在MDC correspondingvalue将被输出。 |
% | 写上%%后将直接输出一个%符号 |
关于Logback配置中支持if添加语句,之所以使用该方式,是因为在工作过程中,需要判断生产环境不让日志打印在catalina文件中,因此通过if条件语句判断操作系统来实现
需要引入jar
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>${janino.version}</version>
</dependency>
<if condition='property("os.name").contains("Win") | property("os.name").contains("Mac")'>
<then>
<appender-ref ref="STDOUT"/>
</then>
</if>