使用logrotate的垃圾收集器日志(loggc)文件旋转无法正常工作

当使用Linux logrotate命令使用JVM垃圾回收日志选项时,我遇到了一个奇怪的问题。 当执行旋转时,它会将NUL(^ @)值作为参数给JVM的第一行。

假设这是java调用(Test.class位于/ home / test /):

java -Xloggc:/home/test/test.log -cp / home / test / Test

该文件的logrotateconfiguration如下:

/home/test/test.log {
旋转56
missingok
notifempty
copytruncate
nocreate的
nomail
}

我还有一个crontab项目logging每分钟testing的目的:

* / 1 * * * * / usr / sbin / logrotate -f /etc/logrotate.d/gcLog

我得出的结论是,JVM写在追加模式,并保留用于写入下一行在相关文件中的某种偏移量,即使该文件被截断logrotate(我可能是错误的)。

我的下一个想法是尝试将stdoutredirect到test.log文件。 我用这个java调用,并保持相同的configurationlogrotate和cron:

java -verbose:gc -cp / home / test / Test> /home/test/test.log

再次,当test.log被logrotate截断时,新创build的文件将在第一行填充NUL(^ @)值。

没有必要说,我没有发现任何有用的使用谷歌。 我发现了另一个关于stackoverflow种类的问题,但我无法设置Java脚本包装器,所以这是行不通的。

有人遇到过这个问题吗? 任何想法为什么发生这种情况? 更好,任何解决方法或解决scheme? 我需要尝试和调用应用程序的一些脚本读取输出,也许看看Tomcat日志和旋转标准输出在catalina.out(这里一些帮助将非常感激,以及)

Solutions Collecting From Web of "使用logrotate的垃圾收集器日志(loggc)文件旋转无法正常工作"

我们在运行Jboss7和Java6的地方遇到了同样的问题,我们在GC文件中得到了空值,而且它们只是不断增长。

解决的办法是将GC记录到stdout,然后 stdout 附加到一个文件中:

简单的例子:

 java -verbose:gc >> console.log 

显然使用append(>>)将Java“指针”移除到文件中的一个位置。 还有一个额外的好处就是不必重启每个服务器的GC日志,所以我们可以有一些统计数据。

至少IBM PMAT工具在使用GC输出解析sysout时没有问题。

最简单的解决方案有时是最好的:)

虽然我希望Java支持GC日志的轮换,正如我看到有人以前一直在讨论: http : //mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html

为了解释空值,Java维护一个内部引用来计算缩进的位置,并且当你移动文件的时候,会导致空字符被写入日志。

我已经看到篡改GC日志文件,导致系统崩溃,在写入日志文件时引起的异常被忽略(请参阅代码http://pastebin.com/HWkNv3PM )导致JVM继续忽略错误。

当文件被重新打开时,我相信位置计数器没有被重置。

关于如何滚动日志文件的其他想法 – 另请参阅: 在Java中滚动垃圾收集器日志

一个简单的解决方法是改变我在我的问题中使用的Java调用:

java -Xloggc:/home/test/test.log -cp / home / test / Test

java -verbose:gc -cp / home / test / Test | tee -a / home / test / test / log

logrotate和cron的配置可以保持不变(即使应该增加cron周期)。

请参阅我的评论下的链接提供有关logrotate和文件处理程序在Linux中的更多细节。 另请参阅brainzzy关于Java行为的解释 。

而不是java -verbose:gc >> console.log我可以这样做:java -Xloggc:logs / gc.log >> console.log所以输出结果将被保存在一个文件中,然后也转到console.log?