【问题标题】:Log4j 2 doesn't write to fileLog4j 2 不写入文件
【发布时间】:2014-09-26 22:41:12
【问题描述】:

有以下配置文件:

<?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 的文件,格式略有不同。但是,运行我的应用程序会导致所有内容都写入控制台,留下一个空文件(已创建,只是未填充)。

不知何故,根记录器似乎捕获了所有内容,因为我也尝试过这个:

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

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

【问题讨论】:

    标签: java logging log4j log4j2


    【解决方案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 时刷新。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这并没有解决我原来的问题,但确实解决了我后来遇到的问题,谢谢!
      【解决方案3】:

      试试这样的。

      这里 Target 是需要注意的重要属性。

      控制台附加程序定义了一个参数元素。查看 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>
      

      【讨论】:

      • 您的示例配置似乎适用于 log4j-1.2,但问题是适用于 log4j2。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 2016-01-30
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        相关资源
        最近更新 更多