gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:27:37 25 4
gpt4 key购买 nike

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

假设这是 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 截断(我可能是错的)。
< br/>

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

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

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


不用说,我没有发现使用谷歌有任何帮助。我在 stackoverflow 上发现了另一个相关问题,但我无法设置 Java Script Wrapper,所以这不起作用。

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

最佳答案

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

解决方案是将 GC 记录到标准输出,然后将标准输出附加到一个文件:

简单的例子:

java -verbose:gc >> console.log

显然使用附加 (>>) 摆脱了指向文件中某个位置的 Java“指针”。额外的好处是不会在每次服务器重启时重置 GC 日志,因此我们可以随着时间的推移获得一些统计数据。

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

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

尽管我希望 Java 支持 GC 日志的轮换,正如我之前看到有人讨论过的那样: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html

关于java - 使用 logrotate 的垃圾收集器日志 (loggc) 文件轮换无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8353401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com