0

我从log4j使用属性文件切换到使用 xml,最后切换到log4j2,因为我想要日志文件上的时间戳。

    <RollingFile name="File" fileName="log/${name}.log"
        filePattern="log/${name}-%d{dd-MM-yyyy_HH.mm.ss}.log">
        <PatternLayout
            pattern="${pattern}" />

        <Policies>
            <OnStartupTriggeringPolicy>false</OnStartupTriggeringPolicy>
            <SizeBasedTriggeringPolicy size="100 MB" /> <!-- Or every 100 MB -->
        </Policies>

    </RollingFile>

我的问题是文件上的时间戳对于它们的内容是“新的”,因为日志机制,即在我的程序每次运行后${name}.log写入一个文件,如果已经有一个具有给定名称的文件,log/${name}-%d{dd-MM-yyyy_HH.mm.ss}.log则创建一个文件并将前一个文件的内容复制到其中。然后${name}.log被当前运行的日志信息覆盖。

因此,时间戳日志文件的内容与其名称中给出的时间之间总是存在差异。

问题

有可能解决这个问题吗?如果是,我必须配置什么?


例子

name.log :包含第二次运行的数据

19-07-2013 13:10:58.462 [main] INFO  main.App (App.java:60) 
Trying to print string!

19-07-2013 13:10:58.467 [main] INFO  main.App (App.java:61) 
Be aware!

19-07-2013 13:10:58.467 [main] INFO  main.App (App.java:63) 
String printed

19-07-2013 13:10:58.467 [main] DEBUG main.App (App.java:64) 
Program executed!

name-19-07-2013_ 13.10.58 .log :包含第一次运行的数据

19-07-2013 13:00:10.788 [main] INFO  main.App (App.java:60) 
Trying to print string!

19-07-2013 13:00:10.794 [main] INFO  main.App (App.java:61) 
Be aware!

19-07-2013 13:00:10.795 [main] INFO  main.App (App.java:63) 
String printed

19-07-2013 13:00:10.795 [main] DEBUG main.App (App.java:64) 
Program executed!

附加数据

Run #1 started at: 19-07-2013 13:00:10
Run #2 started at: 19-07-2013 13:10:58

Run #1 log file  : name-19-07-2013_13.10.58.log
Run #2 log file  : name.log

如您所见,第一次运行日志的文件名取决于第二次运行的开始时间。我觉得这令人恼火和误导。

4

1 回答 1

1

无法配置任何现有的附加程序来执行您想要的操作。

你可以使用,FileAppender但是当它变得太大时它不会翻转。

在满足条件RollingFileAppender,它将始终使用提供的模式写入fileName并将该文件的内容移动到一个文件中(因此它永远不会创建具有指定模式的文件然后写入该文件)。这意味着,从您的角度来看,文件的时间戳将始终位于文件中的最后一个日志条目之后。这是设计使然。

要解决此问题,您必须编写自己的附加程序。

于 2013-07-19T13:06:11.593 回答