log4j 中“ThreadContext”的替代方案

Posted

技术标签:

【中文标题】log4j 中“ThreadContext”的替代方案【英文标题】:Alternative to 'ThreadContext' in log4j 【发布时间】:2016-02-28 08:00:12 【问题描述】:

我一直在做一个使用 log4j2 的项目,在这个项目中我使用了 ThreadContext。现在我又开始使用 log4j (1),它不提供 ThreadContext。我可以使用 ThreadContext 有什么好的选择吗?谷歌搜索还没有给我任何好的想法,所以我希望这里有人可以提供一些意见。

【问题讨论】:

【参考方案1】:

您可以直接使用 MDC(映射诊断上下文)。有关详细信息,请参阅here。另请参阅此example,了解如何使用它。

基本上,您将使用以下方法设置属性:

MDC.put("userName", "test");

然后在记录器中,您可以记录以下信息:

#note the %XuserName - this is how you fetch data from Mapped Diagnostic Context (MDC)
log4j.appender.consoleAppender.layout.ConversionPattern = %-4r [%t] %5p %c %x - %m - user: %XuserName%n

或者如果使用 xml 配置,您可以为该用户配置一个带有过滤器的单独附加程序,例如:

<appender name="Test" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="my.log" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="[%dHH:mm:ss.SSS] %-8p [%-5t] %C2:%-12M - %m%n user: %XuserName" />
        </layout>
        <filter class="org.apache.log4j.varia.StringMatchFilter">
                  <param name="StringToMatch" value=" user: test " />
                  <param name="AcceptOnMatch" value="true" />
          </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
    </appender>

然后仅为该附加程序启用记录器:

<logger name="com.example.Clazz" additivity="false">
    <level value="info" />
    <appender-ref ref="Test"/>
</logger>

这样您就可以看到仅与用户test 相关的日志。

【讨论】:

以上是关于log4j 中“ThreadContext”的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2之ThreadContext

lo4j2配置示例

如何在日志文本上将OrderId显示为Log4j模式布局

log4j 2.16.0 中 log4j 1.2.17 中 LogManager.setRepositorySelector() 的替代方案

log4j2 isThreadContextMapInheritable 属性用法

在 log4j2 中从 ThreadContext 设置和获取值