多次访问debug.log文件,创建无序文件

时间:2018-01-22 19:38:47

标签: log4j2 rollingfileappender crontrigger

我正在使用log4j2.xml进行日志记录。我的应用程序的3个实例同时写入debug.log文件(使用Rollingfile appender和CronTriggeringPolicy)。但是,debug.log文件没有按顺序生成,并且在多次访问期间缺少某些序列和日志。如果我使用单一访问进行测试,它将按预期工作。

<Appenders>
        <RollingFile name="application" fileName="${log-path}/debug.log"
            filePattern="${log-path}/debug.log.%i">
            <PatternLayout>
                <pattern>[%d{yyyy-MM-dd HH:mm:ss,SSS}]%5p [%t] (%F:%M:%L) - %m%n</pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="0 0/2 * 1/1 * ? *" />               
            </Policies>
            <DefaultRolloverStrategy fileindex="min" min="1" max="5" />
        </RollingFile>

2 个答案:

答案 0 :(得分:0)

这是预期的行为。如果您将日志文件与%t(您在模式中打印的%t)分开,则可以(人工)获取序列化行。

使用相同import Component from './MyTs.tsx'值编写的行将采用正确的顺序

另一方面,如果您认真考虑正确记录,可能需要考虑使用LOG4J's MDC

答案 1 :(得分:0)

当您的应用程序的3个实例同时运行并登录同一文件时,您不能指望顺序日志。

原因是3个实例正在运行,这意味着3个单独的processes正在运行,而这3个单独的processes正在尝试写入单个文件。

写入文件涉及locking文件资源,写入然后释放锁定。因此,有时,1个进程将获得锁定并写入它。同时,其他2个进程将继续等待,如果buffer将被填满,一些日志将被遗漏,此循环将继续进行应用程序的其他进程。

对于这种情况,您应该使用rsyslog之类的log4j2 SyslogAppender之类的日志守护进程,或者简单的解决方案是通过应用程序的每个并行实例登录单独的文件。