http://logback.qos.ch/manual/mdc.htmlMDC(注意这个类在org.slf4j包里)
基于“多个线程同步处理多个请求”的假设来设计的,上下文信息记录。
——子线程会自动拷贝双亲线程的这类信息。
——如果没有附加处理的话,放入线程池处理的任务会丢失MDC上下文。
该设计假定向MDC放数据的速度不会太快。
最常用的web场景,是集成在一个servlet的Filter中,在请求时载入MDC信息,doFilter处理完成后卸载MDC信息。
——最好在“验证用户”这个Filter之后(或者之中)进行,这样可以把用户验证信息(包括但不限于用户名)写入MDC。
交给线程池处理(submit)之前:MDC.getCopyOfContextMap(),把返回的map当作参数传给任务线程
线程池处理代码的第一行:MDC.setContextMapValues(),把接到的map参数设置到本线程的MDC中(别忘了最后清除掉)
MDCInsertingServletFilter
将web请求常用信息设置到MDC中:
req.remoteHost as returned by the getRemoteHost() method
req.xForwardedFor value of the "X-Forwarded-For" header
req.requestURI as returned by getRequestURI() method
req.requestURL as returned by getRequestURL() method
req.queryString as returned by getQueryString() method
req.userAgent value of the "User-Agent" header
web.xml中的配置
<filter>
<filter-name>MDCInsertingServletFilter</filter-name>
<filter-class>
ch.qos.logback.classic.helpers.MDCInsertingServletFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>MDCInsertingServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意filter顺序,经过该filter过滤之后,其它filter才能打印出MDC信息(特别是struts之类依赖filter处理主逻辑的)
使用例子:
%X{req.remoteHost} %X{req.requestURI}%n%d - %m%n
——其实没多大意义,还是自己写这个filter,挑选自己的有效信息比较好。