在运行时更改记录器

时间:2019-09-07 16:42:11

标签: java log4j log4j2

如果我的代码中将布尔变量设置为true,则我尝试登录到某个布局,否则使用其他布局登录。

目前,我有一个看起来像这样的简单XML:

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false">

    <appender name="console1" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </layout>
    </appender>

    <appender name="console2" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                    value="%-5p %m"/>
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

我想做的是使用console1布局登录date == true,如果使用date == false则使用console2布局登录。

是否可以覆盖getLogger?我可以在xml文件中做一些与布尔变量通信的事情吗?这两种方法中的任何一种我都没有成功...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用模式选择器

PatternLayout可以配置PatternSelector,以允许它根据日志事件的属性或其他因素选择要使用的模式。 PatternSelector通常将配置有defaultPattern属性(当其他条件不匹配时使用)和一组PatternMatch元素,这些元素标识可以选择的各种模式。

MarkerPatternSelector

MarkerPatternSelector根据日志事件中包含的Marker选择模式。如果日志事件中的Marker等于或是PatternMatch键属性上指定的名称的祖先,那么将使用在该PatternMatch元素上指定的模式。

<PatternLayout>
  <MarkerPatternSelector defaultPattern="[%-5level] %c{1.} %msg%n">
    <PatternMatch key="FLOW" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/>
  </MarkerPatternSelector>
</PatternLayout>