【发布时间】:2012-01-11 07:25:53
【问题描述】:
在 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 {
旋转 56
不见不散
通知空
复制截断
不创建
没有邮件
}
我还有一个 crontab 条目记录每分钟用于测试目的:
*/1 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/gcLog
我得出的结论是 JVM 以追加模式写入并保留某种用于在相关文件中写入下一行的偏移量,即使文件被 logrotate 截断(我可能错了)。
我的下一个想法是尝试将标准输出重定向到 test.log 文件。 我使用了这个 java 调用并为 logrotate 和 cron 保留了相同的配置:
java -verbose:gc -cp /home/test/Test > /home/test/test.log
再次,当 test.log 被 logrotate 截断时,新创建的文件在第一行被 NUL (^@) 值填充。
不用说我在使用 google 时没有发现任何有用的东西。 我在 stackoverflow 上发现了另一个相关的问题,但我无法设置 Java Script Wrapper,所以这不起作用。
有人遇到过这个问题吗?知道为什么会这样吗?更好,任何解决方法或解决方案? 我需要尝试将应用程序的调用通过管道传递给一个读取输出的脚本,并可能查看 Tomcat 记录的方式并在 catalina.out 中旋转标准输出(这里也将非常感谢一些帮助)
【问题讨论】:
-
我的工作是减少垃圾、减少 GC 和更短的不需要轮换的日志。 ;)
-
我同意这一点。然而,这不是我老板的观点。
-
至少,他/她可以确保您有足够的磁盘空间进行日志记录,因此不需要轮换。如今,一个 TB 的成本已经不那么高了。
-
我找到了发生这种情况的确切原因。这是由于一些 bourn shell 限制 [link]in-ulm.de/~mascheck/bourne/common.html(tl;dr 完整的解释在那里)当这个 java 调用完成时解决方法很简单:
java -verbose:gc -cp /home/test/ Test | tee -a /home/test/test/log保持 logrotate 和 cron 的配置。 -
@Hyb,一旦您发现这与您发布的上述设置/配置一起工作,请随时添加此作为此问题的答案:) 将来会帮助像您这样的人。
标签: java linux logging garbage-collection