log4j2中的层次结构无法按预期工作

biswetbf  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(124)

下面是一个类和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中出现了warnerror消息。这是我所期望的。但是在logs/foo.log中什么也没有出现,我期望那里出现info消息。同样在控制台上什么也没有出现,我期望那里出现debug消息。所以它没有像我期望的那样工作。那么我的错误是什么呢?
getLogger的参数必须是一个记录器的名称。但是我也看到了一些例子,其中的参数是一个类。这是如何工作的,因为当我这样做时,只有根记录器才记录消息。

t40tm48m

t40tm48m1#

在Log4j2中有两种继承:

  • 记录器配置的继承,也称为“记录器层次结构”,它将使名为“foo.bar.baz”的记录器使用其最近祖先(“foo.bar”)的配置。您的“foo.bar”记录器使用您明确赋予它的配置。
  • 追加器的继承,也称为“添加性”,它将导致记录器配置继承其父级的所有追加器,除非您使用additivity="false"。在您的示例中,“foo.bar“配置不使用“foo”配置的追加器。

您的配置的另一个问题是“foo.bar“记录器的级别被设置为WARN,因此它永远不会发送任何级别不同于WARNERROR的日志事件。如果您不想限制记录器本身,而是限制附加器,您可以在<AppenderRef>上设置level="WARN"
如果您的目的是将不同的日志级别拆分到不同的日志文件中,则可以混合使用level设置(基本上是一个阈值过滤器)和LevelMatchFilter(或RoutingAppender):

<Logger name="foo.bar" level="DEBUG" additivity="false">
  <AppenderRef ref="foo.bar" level="WARN" />
  <AppenderRef ref="foo">
    <LevelMatchFilter level="INFO" />
  </AppenderRef>
  <AppenderRef ref="console">
    <LevelMatchFilter level="DEBUG" />
  </AppenderRef>
</Logger>

相关问题