在运行时更改记录器

Change logger at runtime

如果我的代码中的布尔变量设置为 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 文件中做些什么来与布尔变量通信吗?这两种方法我都没有成功...

感谢您的帮助!

您可以使用模式选择器

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>