替代' ThreadContext'在log4j中

时间:2015-11-25 13:42:21

标签: java logging log4j log4j2 threadcontext

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

或者,如果使用xml配置,您可以为该用户配置带有过滤器的单独appender,例如:

<appender name="Test" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="my.log" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="[%d{HH:mm:ss.SSS}] %-8p [%-5t] %C{2}:%-12M - %m%n user: %X{userName}" />
        </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>

然后只为该appender启用一个记录器:

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

通过这种方式,您可以看到仅与用户test相关的日志。