gpt4 book ai didi

java - 无法将值放入 M​​DC

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:58 24 4
gpt4 key购买 nike

我试图在 wicket 的 RequestCycle()onBeginRequest() 中记录一些值。但是这些值没有记录在调试文件中。我将 MDC 中的值放在 RequestCycleListeners() 中。

代码如下:

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 的类中添加了这个 listener

我正在使用 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 key ,则 MDC 值只会输出到日志。由于 slf4j 只是一个外观,您需要在 slf4j 下具有特定于框架的支持和配置才能使用 MDC。阅读 slf4j 的注释 here .

因此,例如,如果您使用 log4j 作为 slf4j 下的 impl,那么您将需要 log4j 配置 (ConversionPattern),例如:

%d %-5p [%c] [%X{serverName} %X{sessionId}] %m%n

其中 %X{serverName} %X{sessionId} 是从 MDC 中提取值的相关部分。

Here这是一个使用 log4j 而不使用 sl4j 的很好的例子。请参阅 log4j javadoc 中关于 X 转换字符的注释 here .

请注意,logback 的模式语法是相同的。查看 logback 的细节 here .

另请注意,MDC 的最佳实践(在底层使用 ThreadLocal)是在上下文不再存在时清除上下文(删除您放入映射中的值)范围。这通常意味着在 finally block 中调用 removeclear,例如:

try {
//...
MDC.put("key1", value1);
MDC.put("key2", value2);
//...
} finally {
//this
MDC.remove("key1");
MDC.remove("key2");
//or this
MDC.clear();
}

如果持有 MDC 的线程属于一个供以后重用的池,这一点尤其重要。您当然不希望无意中记录无效的上下文值,因为这只会引起混淆。

编辑

您的 log4j 配置似乎有点奇怪,原因如下:

  1. 您正在根据日志级别命名您的 appender,这可能会导致混淆
  2. 您的RollingFileAppender 没有定义文件
  3. 您的 root 记录器将记录到 3 个不同的附加程序,其中一个名为 DEBUG,但它被配置为仅记录 INFO 级别和更大(基于 priority 标签),因此不会记录调试语句

除非您单独配置了一些未显示的特定类别,否则我猜测您的 LOGGER.debug 语句没有被记录,无论您尝试使用 MDC。

关于java - 无法将值放入 M​​DC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com