在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的方式(这里也将提供一些帮助)
我们在运行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