一尘不染

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

linux

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

可以说这是java调用(Test.class位于/ home / test /中):

java -Xloggc:/home/test/test.log -cp / home / test /测试

此文件的logrotate配置如下:

/home/test/test.log {
旋转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 /测试> /home/test/test.log

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

不用说,使用Google找不到任何有用的东西。我发现了另一个与stackoverflow相关的问题,但是我无法设置Java Script
Wrapper,所以这行不通。

有人遇到过这个问题吗?知道为什么会这样吗?更好的解决方法或解决方案吗?我需要尝试将对应用程序的调用传递到一些读取输出的脚本,也许还要看一下Tomcat记录和在catalina.out中旋转stdout的方式(这里也将提供一些帮助)


阅读 498

收藏
2020-06-03

共1个答案

一尘不染

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

解决方案是只将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

2020-06-03