【问题标题】:How to find out what stopped FileAppender rolling over properly如何找出是什么阻止了 FileAppender 正确滚动
【发布时间】:2017-06-16 20:55:06
【问题描述】:

更新:有趣的是,我只看到以下问题发生在 Windows 环境中,但在每个部署的 Linux 环境中都可以正常工作。

我有一个带有 FileAppender 的 Log4j 1.2.17 的 Spring 应用程序 (3.2),这是配置

log4j.rootCategory=TRACE, ROL

log4j.appender.ROL=org.apache.log4j.RollingFileAppender
log4j.appender.ROL.Encoding=UTF-8
log4j.appender.ROL.File=C:/logs/spring-app/application-log4j.log
log4j.appender.ROL.MaxFileSize=10000KB
log4j.appender.ROL.MaxBackupIndex=10
log4j.appender.ROL.layout=org.apache.log4j.PatternLayout
log4j.appender.ROL.layout.ConversionPattern=%d -- %p -- %c -- %m%n

由于某种原因,我发现日志文件有时会停止滚动并且变得非常大,因此我添加了 log4j 调试模式

-Dlog4j.debug

我发现以下问题是症状

这是记录过程正常工作的时候

log4j: rolling over count=10332832
log4j: maxBackupIndex=10
log4j: Renaming file C:\logs\spring-app\application-log4j.log.9 to C:\logs\spring-app\application-log4j.log.10
log4j: Renaming file C:\logs\spring-app\application-log4j.log.8 to C:\logs\spring-app\application-log4j.log.9
log4j: Renaming file C:\logs\spring-app\application-log4j.log.7 to C:\logs\spring-app\application-log4j.log.8
log4j: Renaming file C:\logs\spring-app\application-log4j.log.6 to C:\logs\spring-app\application-log4j.log.7
log4j: Renaming file C:\logs\spring-app\application-log4j.log.5 to C:\logs\spring-app\application-log4j.log.6
log4j: Renaming file C:\logs\spring-app\application-log4j.log.4 to C:\logs\spring-app\application-log4j.log.5
log4j: Renaming file C:\logs\spring-app\application-log4j.log.3 to C:\logs\spring-app\application-log4j.log.4
log4j: Renaming file C:\logs\spring-app\application-log4j.log.2 to C:\logs\spring-app\application-log4j.log.3
log4j: Renaming file C:\logs\spring-app\application-log4j.log.1 to C:\logs\spring-app\application-log4j.log.2
log4j: Renaming file C:\logs\spring-app\application-log4j.log to C:\logs\spring-app\application-log4j.log.1
log4j: setFile called: C:/STS/STS.3.2.0/logs/spring-app/application-log4j.log, true
log4j: setFile ended

这是 appender 失败的开始

log4j: rolling over count=10332832
log4j: maxBackupIndex=10
log4j: Renaming file C:\logs\spring-app\application-log4j.log.9 to C:\logs\spring-app\application-log4j.log.10
log4j: Renaming file C:\logs\spring-app\application-log4j.log.8 to C:\logs\spring-app\application-log4j.log.9
log4j: Renaming file C:\logs\spring-app\application-log4j.log.7 to C:\logs\spring-app\application-log4j.log.8
log4j: Renaming file C:\logs\spring-app\application-log4j.log.6 to C:\logs\spring-app\application-log4j.log.7
log4j: Renaming file C:\logs\spring-app\application-log4j.log.5 to C:\logs\spring-app\application-log4j.log.6
log4j: Renaming file C:\logs\spring-app\application-log4j.log.4 to C:\logs\spring-app\application-log4j.log.5
log4j: Renaming file C:\logs\spring-app\application-log4j.log.3 to C:\logs\spring-app\application-log4j.log.4
log4j: Renaming file C:\logs\spring-app\application-log4j.log.2 to C:\logs\spring-app\application-log4j.log.3
#Apparently fail the rename log.1 -> log.2
log4j: Renaming file C:\logs\spring-app\application-log4j.log to C:\logs\spring-app\application-log4j.log.1
log4j: setFile called: C:/STS/STS.3.2.0/logs/spring-app/application-log4j.log, true
log4j: setFile ended

这个问题使得旧的日志(log.3 ~ log.9)逐渐被重命名而全部消失,只留下第一个——application-log4j.log。所以这个文件可以疯狂地增长到 1 GB+,并且不会生成其他日志。

但现在我真的没有太多方法可以深入了解导致此问题的确切原因(第二个日志文件未能重命名,似乎是放在文件上的日志)

【问题讨论】:

    标签: java spring logging log4j


    【解决方案1】:

    在 log4j 1.2.17 中存在与 org.apache.log4j.RollingFileAppender 相关的已知问题。例如,this bug in log4j 的描述与您的问题相似。

    您应该在Apache Extras™ for Apache log4j™ 中使用rolling file appender,因为它是recommended in the Javadoc to do so。这是link on Maven Central to the library

    您是否尝试过以下配置以查看它是否解决了您的问题?

    log4j.appender.ROL=org.apache.log4j.rolling.RollingFileAppender
    log4j.appender.ROL.Encoding=UTF-8
    log4j.appender.ROL.File=C:/logs/spring-app/application-log4j.log
    log4j.appender.ROL.layout = org.apache.log4j.PatternLayout
    log4j.appender.ROL.layout.ConversionPattern=%d -- %p -- %c -- %m%n
    log4j.appender.ROL.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
    log4j.appender.ROL.TriggeringPolicy.MaxFileSize=10000KB 
    log4j.appender.ROL.RollingPolicy=org.apache.log4j.rolling.FixedWindowRollingPolicy
    log4j.appender.ROL.RollingPolicy.ActiveFileName=C:/logs/spring-app/application-log4j.log
    log4j.appender.ROL.RollingPolicy.FileNamePattern=C:/logs/spring-app/application-log4j.log.%i
    log4j.appender.ROL.RollingPolicy.MaxIndex=10
    

    最后,log4j 是一个老库,没有积极开发。如果可行,您应该强烈考虑升级到 log4j 2.0。

    【讨论】:

    • 谢谢您的建议。我尝试了Apache Extras for Apache log4j,但在测试了两个小时后,日志停止滚动并在第一个文件中继续增长。我很确定没有其他线程在运行不同的 Log4j 实例,也没有人用 Windows 记事本打开日志。
    • 另一个有趣的因素是,这个问题似乎只发生在 Windows 环境中,从未在任何 Linux 环境中发生过。所以看起来Log4J在windows中I/O期间的时序不太好。
    • 另一方面,是否有任何发行说明在某些版本的 Log4j 中指出此类 RollingFileAppender 问题已得到修复?我找不到相关的文档来知道哪个版本完全修复了它。更改为 Log4j2 的代码更改量很大,因此只是想在此处查看文档说明该问题已通过某些版本的 Log4J 解决?
    • @Dreamer 是的,这是 Windows 上的一个已知问题。一种解决方法是使用基于时间的策略在翻转时创建唯一的文件名。见apache-logging.6191.n7.nabble.com/…
    猜你喜欢
    • 2011-01-18
    • 2014-04-21
    • 1970-01-01
    • 2012-12-07
    • 2015-12-12
    • 2013-04-02
    • 2018-11-03
    • 2023-02-22
    • 2018-08-09
    相关资源
    最近更新 更多