为什么JBoss和Logrotate创build了充满NUL字符的日志文件?

我已经设置了Logrotate来每晚转动我的JBoss应用程序服务器4.2.2.GA日志。 在日志文件轮换后,JBoss开始再次写入日志文件之后,新的日志文件开始的NUL字符数与前一个日志文件中的字符数一样多,后面是新的日志消息。 例如,如果JBoss server.log文件的长度是5000字节,那么在循环之后,新的server.log文件将以5000个NUL字符开始。 几天之后,server.log以NUL字符开头,与之前所有日志文件中的字符相结合。 看起来好像JBoss正在logging它在日志文件中的位置并拾取它在截断文件中的位置。 这里是我的JBoss的logrotateconfiguration:

/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的文件。

    根据我的经验 – 我们不使用log4j的原因是logrotate的工作方式是重命名文件,然后指示程序closures它的日志,并用旧的文件名重新打开它们(这不再存在),通常使用HUP信号。

    但Log4j不能被告知重新打开它的日志文件,所以我看到你使用copytruncate来复制文件 – 问题是Log4j使用缓冲作家跟踪正在写入的文件的当前位置以及截断日志文件log4j在截断之前不停地写入数据。 根据您的文件系统实现,这应该创build“带孔洞的文件”,即您看到的NULL字符并不存在 – 文件实际上只与实际数据一样大,NULL字符是您的查看器代表的方式孔。 另一方面,一些文件系统不支持漏洞,当Log4j恢复写入时,确实会填充空字符。

    我build议 – 不要使用logrotate,通过使用RollingFileAppender(支持删除旧文件)或者使用DailyRollingFileAppender和一个从外部删除旧文件的cronjob来find某种方法来在Log4j中轮转文件(因为它是为了完成)。

    这完美的作品。 总结一下@Guss的build议:

    1.打开你的“log4j.xml”并添加下面的appender(我已经使用了DailyRollingAppender类,并将其configuration为每日滚动):

    *注意:翻转频率是基于“DatePattern”。 请参阅: http : //www.codejava.net/coding/configure-log4j-for-creating-daily-rolling-log-files

     <appender name="RollingAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="/logging_directory_path_here/server1.log" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/> </layout> </appender> <root> <priority value="info" /> <appender-ref ref="RollingAppender" /> </root> 
    1. 创build一个压缩roll-overed日志文件的shell脚本。
    2. 在Unix服务器的Crontab中安装Shell脚本让它每天运行。 例如:在12:10 am每天运行(为什么是上午12点10分?这为log4j提供了充足的时间来完成滚动,以防日志文件过大或日志文件过多压缩)。
    3. 最后确保log4j Rollover在12:00 am运行(默认),并在12:10 am执行shell脚本的cron作业