Log4j 2不写入文件

时间:2014-08-04 12:43:40

标签: 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>

仅将(全部)日志记录输出写入控制台。但是我打算在error之上写一个名为error.log的文件,格式略有不同。但是,运行我的应用程序会导致所有内容都被写入控制台,而后面会留下一个空文件(它被创建,只是没有填充)。

不知何故,Root logger似乎捕获了所有东西,因为我也试过了:

<Logger name="errors" level="error">
    <AppenderRef ref="Console"/>
</Logger>

不会记录两次。我真的没有想法,我甚至从文档中复制了一个示例(sample #2 from here),并且还留下了一个空文件。

4 个答案:

答案 0 :(得分:11)

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

<Loggers>
  <Root level="all">
    <AppenderRef ref="Console" level="trace" />
    <AppenderRef ref="File" level="error" />
  </Root>
</Loggers>

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

答案 1 :(得分:4)

啊,我是个傻瓜。属性name似乎是一个类将使用该记录器的过滤器。将name更改为我的顶级包解决了这个问题。

答案 2 :(得分:1)

在进程完成之前,Log4J2不会写入文件。默认情况下,每次调用记录器时都不会刷新缓冲区。 例如,

<File name="File" fileName="LogfileName.log" immediateFlush="false" append="false">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>

不会立即登录到该文件。将immediateFlush的值更改为true以强制缓冲区在每次调用logger时刷新。

答案 3 :(得分:-2)

尝试这样的事情。

这里Target是值得关注的重要属性。

控制台appender定义了一个param元素。查看ConsoleAppender的javadoc,setTarget方法用于选择要将消息打印到System.out或System.err的控制台流。该示例将appender配置为使用System.out。

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>

</log4j:configuration>