是否可以在Sun JVM中滚动垃圾收集器日志?
目前我用以下方法生成日志
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log
Run Code Online (Sandbox Code Playgroud)
但是我必须使用fifo队列和rotatelogs手动旋转它们以创建每天的新日志.我希望有一个更好的解决方案.
也许有一种方法可以从java里面访问这些日志条目,所以我可以将它们重定向到log4j?
编辑:使用fifo队列的解决方案不够好,因为如果从此队列读取的进程(例如rotatelogs)读取速度变慢,则会减慢整个jvm(显然Sun/Oracle会同步执行gc日志记录)
使用带有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的方式(这里也会非常感谢一些帮助)