java - 如何找出阻止 FileAppender 正常滚动的原因

标签 java spring logging log4j

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

我有一个带有 Log4j 1.2.17 和 fileAppender 的 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 Debug模式

-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

这就是追加器失败的开始

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+,并且不会生成其他日志。

但现在我真的没有太多方法可以深入找出到底发生了什么导致了这个问题(第二个日志文件无法重命名,似乎是放在文件上的日志)

最佳答案

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

您应该使用rolling file appenderApache Extras™ for Apache log4j™ 中,因为它是 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。

关于java - 如何找出阻止 FileAppender 正常滚动的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44597853/

相关文章:

java - 在 Java 8 forEach 循环中使用 Spring Data JPA 存储库是线程安全的吗?

Android 日志与 Titanium INFO

java - 如何选择合适的spring、struts和hibernate版本,有什么区别?

Java TicTacToe MiniMax 递归 AI

spring - Autowiring 的 MongoRepository 实现在应用程序启动时抛出 BeanCreationException

java - 在分布式环境中使用JPA而不使用EJB

java - Android 尚不支持 DICOM JPEG 压缩

java - CryptoJS 解密(AES)来自 Java 的文件 bytearray

java - 使用 Logback 但 Log4j 开始显示 WARN no Appenders

sql-server - bigint 对于事件日志表来说足够大吗?