java – 不能将值放在MDC中
|
我试图在门票中的RequestCycle()的onBeginRequest()中记录几个值.
以下是代码: getRequestCycleListeners().add(new AbstractRequestCycleListener()
{
public void onBeginRequest(RequestCycle cycle)
{
if( cycle.getRequest().getContainerRequest() instanceof HttpServletRequest )
{
HttpServletRequest containerRequest =
(HttpServletRequest)cycle.getRequest().getContainerRequest();
MDC.put("serverName",containerRequest.getServerName());
MDC.put("sessionId",containerRequest.getSession().getId());
LOGGER.debug("logging from RequestCycleListeners() !!!");
WebClientInfo webClientInfo = new WebClientInfo(RequestCycle.get());
System.out.println(webClientInfo.getUserAgent());
System.out.println("webClientInfo.getProperties().getBrowserVersionMajor() " +containerRequest.getRemoteAddr());
}
}; 我期待’serverName’,’sessionId’被记录在调试文件中. 我已经在扩展WebApplication的类中添加了这个监听器. 我使用的是log4j.xml,DEBUG appender如下所示: <appender name="DEBUG" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ISO8601} %t %5p] %m -- %X{serverName} -- %X{sessionId} -- %X{portNumber}%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG"/>
<param name="LevelMax" value="WARN"/>
</filter>
</appender>
我们正在根标记中定义范围: <root> <priority value="INFO" /> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG" /> <appender-ref ref="ERROR" /> </root> 解决方法通常,如果您通过配置在记录模式中包含MDC密钥,则MDC值仅输出到日志.由于slf4j只是一个立面,您需要在slf4j下面使用框架特定的支持和配置来使用MDC.阅读slf4j关于 here的注释.所以,例如,如果您使用log4j作为slf4j下的impl,那么您将需要log4j config(ConversionPattern),如: %d %-5p [%c] [%X{serverName} %X{sessionId}] %m%n
其中%X {serverName}%X {sessionId}是从MDC中提取值的相关部分. Here是一个非常好的例子,使用没有sl4j的log4j.请参阅log4j javadoc here中X转换字符的注释. 请注意,logback的模式语法是相同的.请参阅logback here的详细信息. 另请注意,MDC(使用ThreadLocal的引擎)的最佳做法是在上下文不再在范围内时清除上下文(删除您在地图中放置的值).这通常意味着在finally块中调用remove或clear,如: try {
//...
MDC.put("key1",value1);
MDC.put("key2",value2);
//...
} finally {
//this
MDC.remove("key1");
MDC.remove("key2");
//or this
MDC.clear();
}
如果保存MDC的线程属于一个池以供以后重用,这一点尤为重要.您当然不想无意地记录无效的上下文值,因为这将导致混乱. 编辑 您的log4j配置似乎有点奇怪,原因如下: >您正在命名您的追加者日志级别,这可能会导致混乱 除非您具有单独配置的未显示的特定类别,否则我猜测您的LOGGER.debug语句都不会被记录,无论您尝试使用MDC. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
