log4j 2:正在创建的日志文件,但未写入

时间:2016-04-25 16:56:31

标签: java xml logging log4j2

我正在使用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> 

我将输出定向到位于系统变量&#34; logFilePath&#34;的文件。

我不确定发生了什么,并且类似问题的答案中显示的配置文件不是XML格式,因此我不确定如何将配置文件代码传递给XML。

3 个答案:

答案 0 :(得分:2)

在评论中提到的情况下,您没有名为applicatiionFramework的软件包。因此,请根据要记录日志事件的类的包名更改name属性。

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

有关详细信息,请访问log4j-manual-configuration

答案 1 :(得分:0)

很高兴另一个答案有所帮助。你需要命名的记录器吗?为什么不只有根记录器?此外,您声明了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来说明这一点。

如果您希望日志显示位置信息并使用异步记录器或追加器,则需要在Async Appender上指定includeLocation="true"

答案 2 :(得分:0)

对于完整的菜鸟,就像我一样,这条线在上面的未知答案中

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

是关键。当它说&#34;你的包裹&#34;它真的意味着&#34;包foo.bar&#34;您在创建Logger的.java文件的顶部声明,而不是您为创建Logger而传递的类名,如:

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

我今天花了很多时间才把我的log4j2输出转到一个文件,玩各种&#34;名称&#34;直到灯泡亮起的价值观。