我已设置 Logrotate 以每晚轮换我的 JBoss Application Server 4.2.2.GA 日志。在日志文件被轮换并且 JBoss 再次开始写入它们之后,新的日志文件以与前一个日志文件中的字符一样多的 NUL 字符开头,然后是新的日志消息。例如,如果 JBoss server.log 文件的长度为 5000 字节,那么在轮换之后,新的 server.log 文件将以 5000 个 NUL 字符开头。几天后,server.log 以 NUL 字符开头,相当于所有前几天日志文件中的字符组合。似乎 JBoss 正在记住它在日志文件中的位置,并在截断文件中从中断的地方开始。这是我的 JBoss 的 logrotate 配置:
/apps/jboss-4.2.2.GA/server/default/log/*log {
daily
rotate 30
compress
notifempty
copytruncate
missingok
nocreate
}
我不能每晚重新启动 JBoss,因为那会导致过多的停机时间。我也不能使用 log4j DailyRollingFileAppender,因为它不会删除旧的日志文件。有没有人让 logrotate 与 JBoss 一起正常工作?
对于 log4j 写入的文件,我们遇到了同样的问题。解决方案是将 FileAppender 的属性“Append”设置为“true”。在此更改之后,我们没有看到文件在由 logrotate 等外部程序旋转时具有 NUL 的问题。
根据我的经验 - 我们不将 logrotate 与 Log4j 一起使用的原因是 logrotate 的工作方式是它重命名文件,然后指示程序关闭其日志并使用旧文件名重新打开它们(不再存在),通常使用 HUP 信号。
但是不能告诉 Log4j 重新打开它的日志文件,所以我看到你用它
copytruncate
来复制文件 - 问题是 Log4j 使用缓冲写入器来跟踪正在写入的文件的当前位置以及何时截断日志文件 log4j 继续从截断之前停止写入的位置写入。根据您的文件系统实现,这应该创建“带孔的文件” - 即您看到的 NULL 字符实际上并不存在 - 该文件实际上仅与实际数据一样大,而 NULL 字符是您的查看器表示的方式洞。另一方面,一些文件系统不支持漏洞,当 Log4j 恢复写入时,确实会用 NULL 字符填充文件。我建议 - 不要使用 logrotate,通过使用 RollingFileAppender (确实支持删除旧文件)或使用 DailyRollingFileAppender 和从外部删除旧文件的 cronjob 找到某种方法来旋转 Log4j 中的文件(因为它本来是要完成的) )。
这完美地工作。总结@Guss 的建议:
1. 打开您的“log4j.xml”并添加以下附加程序(我使用 DailyRollingAppender 类并将其配置为每天翻转):
*注意:翻转频率基于“日期模式”。请参阅: http: //www.codejava.net/coding/configure-log4j-for-creating-daily-rolling-log-files