【问题标题】:How to specify a unique name for the JVM crash log files?如何为 JVM 崩溃日志文件指定一个唯一的名称?
【发布时间】:2017-07-04 10:56:45
【问题描述】:

当 JVM 崩溃时,它会生成一个日志文件(默认情况下)保存在应用程序的当前文件夹中,并且其名称遵循以下格式:hs_err_pid[PID].log

我需要让 JVM 将此文件保存在具有所需名称的不同文件夹中。所以,我对虚拟机使用这个命令行参数:

-XX:ErrorFile=./log/jvm_error_pid%p.log

它正在工作,但我不喜欢这个解决方案。假设日志文件夹已经包含一个名为 jvm_error_pid5000.log 的文件。如果将来有 5000 PID 的 JVM 发生崩溃,那么 JVM 不会覆盖日志文件夹中的 jvm_error_pid5000.log 文件,而是将此日志文件保存在完全不同的位置(与我在当前操作系统用户的 TEMP 文件夹中测试)。它甚至不会通过附加随机字符串来重命名新文件以确保唯一性。

我在有关崩溃日志文件的 Oracle 文档页面上没有找到任何有关此唯一性问题的信息。我想知道是否有办法改进该命令行参数,以便它始终生成不同的崩溃日志文件名。例如,我想使用命令行参数将日期和小时放在文件名中:

-XX:ErrorFile=./log/jvm_error_pid%p_%d_%h.log

【问题讨论】:

    标签: java jvm jvm-arguments crash-log


    【解决方案1】:

    您可以做的一件事就是将错误日志通过电子邮件发送到某个电子邮件地址

    java -XX:OnError="cat hs_err_pid%p.log|mail support@acme.com" \ MyApplication
    

    更多信息请参考http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbmum

    【讨论】:

    • 它不适用于我的情况,但这是一个有趣的想法:)
    • 这只是一个变通方法。因此,每次 jvm 崩溃时,您都会收到一封电子邮件,并且您将拥有所有崩溃的日志。
    • 您可以扩展@Leozeo 的想法并制作一个小脚本以输出到包含时间戳的文件名
    【解决方案2】:

    JVM 不会扩展 ErrorFile 中的占位符,而不是 %p。但是您可以修改启动 Java 的 shell 脚本,并改用 shell 变量。

    #!/bin/bash
    TS=`date +%F-%H%M%S`
    java -XX:ErrorFile=/tmp/hserr_%p_$TS.log ...
    

    【讨论】:

    • 想我会随它去,-XX:ErrorFile=./log/jvm_error_pid%p.log 因为这个 JVM 错误无论如何都很少出现(所以有机会有一个副本是超低的)。我将标记这个答案,因为这是在应用程序启动之前在某处动态生成该参数的好主意。
    • 我的另一个想法是实现另一个 Java 应用程序来启动您的实际 Java 应用程序。这是动态生成 -XX:ErrorFile 参数的另一种方法。
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2015-06-07
    • 2019-02-12
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多