Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日志文件中的数据与相应文件名中的时间戳之间的时间差异_Java_Log4j2 - Fatal编程技术网

Java 日志文件中的数据与相应文件名中的时间戳之间的时间差异

Java 日志文件中的数据与相应文件名中的时间戳之间的时间差异,java,log4j2,Java,Log4j2,我从使用属性文件的log4j切换到使用xml,最后切换到log4j2, 因为我想在日志文件上加时间戳 <RollingFile name="File" fileName="log/${name}.log" filePattern="log/${name}-%d{dd-MM-yyyy_HH.mm.ss}.log"> <PatternLayout pattern="${pattern}" />

我从使用属性文件的
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-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
如您所见,第一次运行日志的文件名取决于第二次运行的时间
起动。我觉得这很烦人,也很误导人。

不可能配置任何现有的appender来完成您想要的任务

您可以使用
FileAppender
,但当它变得太大时不会滚动

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


要解决此问题,您必须编写自己的appender。

问题出在哪里?文件名中的时间是文件推出的时间。之后不会追加新消息,因为新消息会发送到普通日志文件。问题是,当log4j2复制旧“当前”文件的内容时,它应该将该文件的创建日期设置为时间戳,而不是与包含的数据无关的较新日期。至少我想这样配置它。但我不能。文件的日期与内容无关。文件中的所有日志记录项都在文件中给定的时间戳之前。这是因为
RollingFileAppender
将当前日志文件重命名为带有时间戳(滚动)的文件,然后创建一个新的文件,其中创建了新的日志实体。您是否完整阅读了我的问题?我知道内在力学是如何工作的。我的问题在于改变它们。如果你决定写自己的附加物,请考虑把它贡献给Log4J2,这样其他人也可以使用它。
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