如何配置log4j2的加法性以尊重父级?

and*_*bd1 4 java configuration logging log4j log4j2

我认为这段代码很好地解释了我正在尝试做的事情

package us.benanderson;

public class MyClass {

  private static final Logger LOG = LogManager.getLogger(MyClass.class);
  ...
    // within a method
    LOG.debug("only output to appFile");
    LOG.error("output to both appFile and errorFile");
Run Code Online (Sandbox Code Playgroud)

这就是我猜应该是我的配置

<Loggers>
    <Logger name="us.benanderson" level="debug" additivity="true">
        <AppenderRef ref="appFile" />
    </Logger>

    <Root level="error">
        <AppenderRef ref="errorFile" />
    </Root>
</Loggers>
Run Code Online (Sandbox Code Playgroud)

但是,我发现当additivity ="true"时,调试消息也会输出到errorFile.当additivity ="false"时,不会向errorFile输出任何内容.有没有办法做我想做的事情?

Rem*_*pma 6

我认为实现你想要的最简单的方法是直接在appender-ref上放一个级别.这样就无需在配置中使用命名记录器,从而简化了配置.

如果要将某个包的日志事件重定向到单独的appender,则命名记录器仍然有用.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <File name="appFile" fileName="logs/appFile.log" append="true">
      <PatternLayout pattern="%-5p %d{ABSOLUTE} [%t] %c - %m%n" />
    </File>
    <File name="errorFile" fileName="logs/errorFile.log" append="true">
      <PatternLayout pattern="%-5p %d{ABSOLUTE} [%t] %c - %m%n" />
    </File>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="appFile" level="debug" />
      <AppenderRef ref="errorFile" level="error" />
    </Root>
  </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

如果您想要进行更多不寻常的过滤,阈值过滤器和过滤器组合尤其有用.例如,如果您只想将INFO和WARN级别事件发送到某个appender,不包括TRACE/DEBUG,还要排除ERROR和FATAL级别事件(!),您可以这样做:

<Console name="only-info-warn">
    <PatternLayout pattern="%-5p %c %message %n" />
    <Filters>

        <!-- First deny error and fatal messages -->
        <ThresholdFilter level="error" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="fatal" onMatch="DENY"   onMismatch="NEUTRAL"/>

        <!-- Then accept info, warn, error, fatal and deny debug/trace -->
        <ThresholdFilter level="warn"  onMatch="ACCEPT" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="info"  onMatch="ACCEPT" onMismatch="DENY"/>
    </Filters>
</Console>
Run Code Online (Sandbox Code Playgroud)