我使用属性文件从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
如您所见,第一次运行日志的文件名取决于第二次运行的时间 开始。我觉得这很刺激和误导。
答案 0 :(得分:1)
无法配置任何现有的appender来执行您想要的操作。
你可以使用FileAppender
但是当它变得太大时它不会翻转。
RollingFileAppender
将始终写入fileName
并在满足条件后将此文件的内容移动到使用提供的模式的文件中(因此它永远不会创建具有指定模式的文件然后写入其中)。这意味着,从您的角度来看,文件的时间戳将始终位于文件中的最后一个日志条目之后。这是设计的。
要解决此问题,您必须编写自己的appender。