下面是一个类和log4j配置:
$ viMy.java
public class My {
private static final Logger logger = LogManager.getLogger("foo.bar");
public static void main(String[] args) {
logger.trace("My trace");
logger.debug("My debug");
logger.info("My info");
logger.warn("My warn");
logger.error("My error");
...
$ vi日志4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="console" target="system_out">
<PatternLayout pattern="%d %-5p %c : %m%n" />
</Console>
<File name="foo" fileName="logs/foo.log">
<PatternLayout pattern="%d %-5p %c : %m%n" />
</File>
<File name="foo.bar" fileName="logs/foo.bar.log">
<PatternLayout pattern="%d %-5p %c : %m%n" />
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="console" />
</Root>
<Logger name="foo" level="info" additivity="false">
<AppenderRef ref="foo" />
</Logger>
<Logger name="foo.bar" level="warn" additivity="false">
<AppenderRef ref="foo.bar" />
</Logger>
</Loggers>
</Configuration>
在logs/foo.bar.log中出现了warn
和error
消息。这是我所期望的。但是在logs/foo.log中什么也没有出现,我期望那里出现info
消息。同样在控制台上什么也没有出现,我期望那里出现debug
消息。所以它没有像我期望的那样工作。那么我的错误是什么呢?
getLogger的参数必须是一个记录器的名称。但是我也看到了一些例子,其中的参数是一个类。这是如何工作的,因为当我这样做时,只有根记录器才记录消息。
1条答案
按热度按时间t40tm48m1#
在Log4j2中有两种继承:
additivity="false"
。在您的示例中,“foo.bar“配置不使用“foo”配置的追加器。您的配置的另一个问题是“foo.bar“记录器的级别被设置为
WARN
,因此它永远不会发送任何级别不同于WARN
和ERROR
的日志事件。如果您不想限制记录器本身,而是限制附加器,您可以在<AppenderRef>
上设置level="WARN"
。如果您的目的是将不同的日志级别拆分到不同的日志文件中,则可以混合使用
level
设置(基本上是一个阈值过滤器)和LevelMatchFilter
(或RoutingAppender
):