Log4j 2不写入文件

Bar*_*lle 6 java logging log4j log4j2

拥有以下配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{HH:mm:ss.SSS} %-5level] %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="error.log">
            <PatternLayout pattern="[%d{ISO8601} %-5level] %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Logger name="errors" level="error">
            <AppenderRef ref="File"/>
        </Logger>
        <Root level="all">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

仅将(全部)日志记录输出写入控制台.然而,我有意将上面的任何内容写入errorerror.log稍微不同的格式命名的文件中.但是,运行我的应用程序会导致所有内容都被写入控制台,而后面会留下一个空文件(它被创建,只是没有填充).

不知何故,似乎Root记录器捕获了所有东西,因为我也试过这个:

<Logger name="errors" level="error">
    <AppenderRef ref="Console"/>
</Logger>
Run Code Online (Sandbox Code Playgroud)

这不会记录两次.我真的没有想法,我甚至从文档中复制了一个例子(样本#2来自这里),并且还留下了一个空文件.

Rem*_*pma 13

是的,根记录器级别为ALL,因此它将接收所有事件.一种选择是这样做:

<Loggers>
  <Root level="all">
    <AppenderRef ref="Console" level="trace" />
    <AppenderRef ref="File" level="error" />
  </Root>
</Loggers>
Run Code Online (Sandbox Code Playgroud)

这样您只需要一个记录器,因此您不必担心可加性,并且在代码中您只需编写LogManager.getLogger(MyClass.class)即可获取Logger实例.(如果使用命名的Logger,则需要在代码中使用记录器名称:LogManager.getLogger("error").)


Bar*_*lle 5

啊,我很傻。该属性name似乎是类将使用该记录器的过滤器。更改name为我的顶级软件包可以解决此问题。