Java 如何为JVM崩溃日志文件指定唯一的名称?

Java 如何为JVM崩溃日志文件指定唯一的名称?,java,jvm,jvm-arguments,crash-log,Java,Jvm,Jvm Arguments,Crash Log,当JVM崩溃时,它会生成一个日志文件,该文件(默认情况下)保存在应用程序的当前文件夹中,并具有以下格式的名称:hs\u err\u pid[pid]。log 我需要让JVM使用所需的名称将此文件保存在不同的文件夹中。因此,我对虚拟机使用以下命令行参数: -XX:ErrorFile=./log/jvm_error_pid%p.log 它正在工作,但我不喜欢这个解决方案的某些方面。假设日志文件夹已经包含一个名为jvm\u error\u pid5000.log的文件。如果一个具有5000 PID的

当JVM崩溃时,它会生成一个日志文件,该文件(默认情况下)保存在应用程序的当前文件夹中,并具有以下格式的名称:hs\u err\u pid[pid]。log

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

-XX:ErrorFile=./log/jvm_error_pid%p.log
它正在工作,但我不喜欢这个解决方案的某些方面。假设日志文件夹已经包含一个名为jvm\u error\u pid5000.log的文件。如果一个具有5000 PID的JVM将来发生崩溃,那么JVM不会覆盖日志文件夹中的JVM_error_pid5000.log文件,它会将此日志文件保存在一个完全不同的位置(与我在当前OS用户的TEMP文件夹中测试的文件不同)。它甚至不会通过添加随机字符串来重命名新文件以确保唯一性

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

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

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

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

有关详细信息,请参阅。

JVM不展开
错误文件中的占位符,而展开
%p
中的占位符。但是您可以修改启动Java的shell脚本,并改用shell变量

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

这不适用于我的情况,但这是一个有趣的想法:)这只是一种变通方法。因此,每次jvm崩溃时,你都会收到一封电子邮件,并记录所有崩溃的情况。你可以扩展@Leozeo的想法,制作一个小脚本,输出到一个包含时间戳的文件名中。我想我只需要使用-XX:ErrorFile=./log/jvm\u error\u pid%p.log就可以了,因为这个jvm错误很少出现(所以复制的几率非常低)。我将标记这个答案,因为这是一个在应用程序启动之前在某处动态生成该参数的好主意。我的另一个想法是实现另一个启动实际Java应用程序的Java应用程序。这是动态生成-XX:ErrorFile参数的另一种方法。