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

Hyb*_*Hyb 13 java linux logging garbage-collection

使用带有Linux logrotate命令的JVM垃圾收集日志选项时,我遇到了一个奇怪的问题.执行旋转时,它将NUL(^ @)值填充为作为JVM参数给出的文件的第一行.

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

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

该文件的logrotate配置如下:

/home/test/test.log {
   rotate 56
   missingok
   notifempty
   copytruncate
   nocreate
   nomail
}

为了测试目的,我每分钟都有一个crontab条目记录:

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

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


我的下一个想法是尝试将stdout重定向到test.log文件.我使用了这个java调用并为logrotate和cron保留了相同的配置:

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

再次,当log.ate截断test.log时,新创建的文件在第一行填充NUL(^ @)值.


没必要说我没有找到任何有用的谷歌.我发现了另一个关于stackoverflow类型的问题,但我无法设置Java Script Wrapper,所以这不起作用.

有人遇到过这个问题吗?知道为什么会这样吗?更好,任何变通方法或解决方案?我需要尝试将对应用程序的调用传递给读取输出的一些脚本,并且可能看看Tomcat在catalina.out中记录和旋转stdout的方式(这里也会非常感谢一些帮助)

小智 6

我们在运行Jboss7和Java6的地方遇到了同样的问题,我们在GC文件中得到了NULL并且它们一直在增长.

解决方案是将GC记录到stdout,然后 stdout 附加到文件:

简单的例子:

java -verbose:gc >> console.log
Run Code Online (Sandbox Code Playgroud)

显然使用append(>>)摆脱了文件中某个位置的Java"指针".还有一个额外的好处就是没有重置每个服务器的GC日志,所以我们可以随着时间的推移得到一些统计数据.

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

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

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