【问题标题】:log4j 2: log file being created, but not being written tolog4j 2:正在创建日志文件,但未写入
【发布时间】:2016-08-19 04:50:51
【问题描述】:

我正在使用 log4j 2。我试图确定为什么我的日志文件没有被写入,但我的控制台是。这是我对控制台的输出:

2016-04-25 12:26:07,142 INFO  [main] helperCode.LogPlus (LogPlus.java:50) - 
----------------------------------------------------------------------------
------------ The test is starting now at 2016-04-25-12-26-07-135 -----------
----------------------------------------------------------------------------

2016-04-25 12:26:07,151 INFO  [main] helperCode.LogPlus (LogPlus.java:50) - 
--------------------------------------------------------------------------
------------ METHOD loginBadPasswordGoodUsername_3 starting:  ------------
--------------------------------------------------------------------------

我已经考虑过的问题:

  • 输出不会重复,因此重定向的日志输出不是问题。
  • 我没有在我的项目中的任何地方使用 java.util.logging.Logger;
  • 日志文件的输出格式是 log4j 样式而不是 JUL 样式,所以我知道 JUL 没有覆盖它;

这是我的 XML 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <File name="FileLogger" fileName="${sys:logFilePath}" append="false">
            <PatternLayout pattern="%d %t %-5p %c{2} - %m%n" />
        </File>
        <Async name="Async">
            <AppenderRef ref="FileLogger" />
        </Async>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="automationFramework" level="trace">
            <AppenderRef ref="FileLogger" />
        </Logger>
        <Root level="trace">
            <AppenderRef ref="STDOUT" />
        </Root>
    </Loggers>
</Configuration> 

我将输出定向到位于系统变量“logFilePath”的文件。

我不确定发生了什么,类似问题的答案中显示的配置文件不是 XML 格式,所以我不确定如何将配置文件代码转换为 XML。

【问题讨论】:

  • 向我们展示你是如何在代码中配置的......以及你是如何实现记录器的......
  • 你的包名是automationFramework(你项目中的java类)?
  • 其实,Unknown,ΦXoce 和 웃 Пepeúpa,我想我刚刚弄明白了。正如您所建议的,未知,从中执行调用的包被命名为不同的名称。我将 log4j 2 配置文件中的包名称更改为该包,它修复了一些问题。谢谢你们!

标签: java xml logging log4j2


【解决方案1】:

对于像我这样的完整菜鸟,上面未知答案中的这一行:

    <Logger name="your package" level="trace">

是关键。当它说“您的包”时,它实际上是指您在创建 Logger 的 .java 文件顶部声明的“包 foo.bar”,而不是您传递给创建 Logger 的类名,例如:

    LOGGER = LogManager.getLogger(MyClass.class.getName());

今天我花了很长时间才将 log4j2 输出写入文件,并在灯泡亮起之前使用各种“名称”值。

【讨论】:

    【解决方案2】:

    很高兴其他答案有所帮助。你需要命名记录器吗?为什么不只拥有根记录器?此外,您声明了一个 Async Appender 但没有使用它。这是故意的吗?这是我的建议:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <Appenders>
            <File name="FileLogger" fileName="${sys:logFilePath}" append="false">
                <PatternLayout pattern="%d %t %-5p %c{2} - %m%n" />
            </File>
            <Async name="Async">
                <AppenderRef ref="FileLogger" />
            </Async>
            <Console name="STDOUT" target="SYSTEM_OUT">
                <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
            </Console>
        </Appenders>
        <Loggers>
            <Root level="trace">
                <AppenderRef ref="STDOUT" level="info" />
                <AppenderRef ref="Async" />
            </Root>
        </Loggers>
    </Configuration> 
    

    请注意,您还可以在AppenderRef 上指定级别。我制作了 Console Appender 级别的 INFO 来说明这一点。

    如果您希望日志显示位置信息并使用异步记录器或附加程序,那么您需要在异步附加程序上指定includeLocation="true"

    【讨论】:

    • 嘿 Remko,是的,我只想记录一个包中的信息,但很高兴知道可以删除此限制。
    【解决方案3】:

    在您在评论中提到的情况下,您没有名为 applicaiionFramework 的包。因此,通过要记录日志事件的类的包名称更改 name 属性。

     <Logger name="your package" level="trace">
                    <AppenderRef ref="FileLogger" />
            <Root level="trace">
                <AppenderRef ref="STDOUT" />
            </Root>
     </Logger>
    

    欲了解更多信息,请访问log4j-manual-configuration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2012-11-03
      • 2014-06-03
      相关资源
      最近更新 更多