我认为这段代码很好地解释了我正在尝试做的事情
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");
这就是我猜应该是我的配置
<Loggers>
<Logger name="us.benanderson" level="debug" additivity="true">
<AppenderRef ref="appFile" />
</Logger>
<Root level="error">
<AppenderRef ref="errorFile" />
</Root>
</Loggers>
但是,我发现当 additivity="true"时,调试消息也会输出到 errorFile。当 additivity="false"时,没有任何内容输出到 errorFile。有什么办法可以做我想做的事吗?
最佳答案
我认为实现你想要的最简单的方法是直接在 appender-ref 上放置一个级别。这消除了在您的配置中使用命名记录器的需要,稍微简化了配置。
如果您想将某个包的日志事件重定向到单独的附加程序,命名记录器仍然很有用。
<?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>
如果您想进行更多不寻常的过滤,阈值过滤器和过滤器组合会特别有用。例如,如果您只想向某个附加程序发送 INFO 和 WARN 级别的事件,排除 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>
关于java - 如何配置log4j 2's additivity to respect parent' s级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532338/