Как указать уникальное имя для файлов журнала сбоев JVM?

При сбое JVM создает файл журнала, который сохраняется (по умолчанию) в текущей папке приложения и имеет имя в следующем формате: hs_err_pid[PID].log

Мне нужно, чтобы JVM сохранила этот файл в другой папке с нужным именем. Итак, я использую этот аргумент командной строки для виртуальной машины:

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

Это работает, но мне что-то не нравится в этом решении. Предположим, что папка журнала уже содержит файл с именем jvm_error_pid5000.log. Если в будущем произойдет сбой на JVM с PID 5000, JVM не переопределит файл jvm_error_pid5000.log из папки журнала и сохранит этот файл журнала в совершенно другом месте (не то, что я проверено в папке TEMP текущего пользователя ОС). Он даже не переименовывает новый файл, добавляя случайную строку для обеспечения уникальности.

Я не нашел ничего об этой проблеме уникальности на странице документации Oracle о файлах журнала сбоев. Я хотел бы знать, есть ли способ улучшить этот аргумент командной строки, чтобы он всегда генерировал разные имена файлов журнала сбоев. Например, я хочу использовать аргумент командной строки, чтобы указать дату и час в имени файла:

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

person Valy    schedule 15.02.2017    source источник


Ответы (2)


JVM не расширяет заполнители в ErrorFile, кроме %p. Но вы можете изменить свой сценарий оболочки, который запускает Java, и вместо этого использовать переменные оболочки.

#!/bin/bash
TS=`date +%F-%H%M%S`
java -XX:ErrorFile=/tmp/hserr_%p_$TS.log ...
person apangin    schedule 15.02.2017
comment
Думаю, я просто оставлю это с -XX:ErrorFile=./log/jvm_error_pid%p.log, так как эта ошибка JVM все равно появляется очень редко (поэтому шанс иметь дубликат очень мал). Я отмечу этот ответ, так как рекомендуется динамически генерировать этот аргумент где-то перед запуском приложения. - person Valy; 16.02.2017
comment
Еще одна идея, которую я бы хотел, - реализовать другое приложение Java, которое запускает ваше настоящее приложение Java. Это еще один способ динамического создания аргумента -XX:ErrorFile. - person Valy; 16.02.2017

одна вещь, которую вы можете сделать, это просто отправить журнал ошибок по электронной почте на какой-либо адрес электронной почты.

java -XX:OnError="cat hs_err_pid%p.log|mail [email protected]" \ MyApplication

См. http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbmum для получения дополнительной информации.

person Atul    schedule 15.02.2017
comment
это неприменимо в моей ситуации, но это интересная идея :) - person Valy; 15.02.2017
comment
Это всего лишь обходной путь. Таким образом, каждый раз, когда jvm дает сбой, вы получаете электронное письмо, и у вас есть журнал всех сбоев. - person Atul; 15.02.2017
comment
вы можете расширить идею @Leozeo и создать небольшой скрипт для вывода в имя файла, которое включает метку времени - person Radu C; 15.02.2017