随笔 - 22, 文章 - 0, 评论 - 1, 引用 - 0
数据加载中……

logback_doc_manual_08_mapped_diagnostic_contexts

http://logback.qos.ch/manual/mdc.html
MDC(注意这个类在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,挑选自己的有效信息比较好。

posted on 2014-07-13 18:59 王星游 阅读(343) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: