Подтвердить что ты не робот

Невозможно работать с журналом журнала ловушек (loggc) с логротатом

Я столкнулся с странной проблемой при использовании JVM файла журнала мусора с командой logrotate Linux. Когда выполняется ротация, он заполняет NUL (^ @) значениями первой строки файла, указанной как аргумент JVM.

Скажем, это java-вызов (Test.class находится в /home/test/ ):

java -Xloggc:/home/test/test.log -cp/home/test/Test

Конфигурация logrotate для этого файла следующая:

/home/test/test.log {
    вращение 56
    missok
    notifempty
    copytruncate
    nocreate
    nomail
}

У меня также есть запись в журнале crontab каждую минуту для тестирования:

*/1 * * * */usr/sbin/logrotate -f/etc/logrotate.d/gcLog

Я пришел к выводу, что JVM записывает в режиме добавления и сохраняет какое-то смещение, используемое для записи следующей строки в связанном файле, даже если файл обрезается с помощью logrotate (возможно, я ошибаюсь).
< бр /" >

Моя следующая идея состояла в том, чтобы попытаться перенаправить файл stdout в файл 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, поэтому это не сработает.

Кто-нибудь сталкивался с этой проблемой? Любая идея, почему это происходит? Лучше, любое решение или решение? Мне нужно попробовать подключить вызов к приложению к некоторому Script чтению вывода и, возможно, взглянуть на то, как Tomcat регистрирует и вращает stdout в catalina.out(здесь также будет очень признательна помощь)

4b9b3361

Ответ 1

У нас была та же проблема, что и у нас на Jboss7 и Java6, мы получали NULL в файле GC, и они просто продолжали расти.

Решение состояло в том, чтобы просто записать GC в stdout, а затем добавить stdout в файл:

Простой пример:

java -verbose:gc >> console.log

Очевидно, использование append ( → ) избавляет Java-указателя от позиции в файле. С дополнительным бонусом, не имеющим журналов GC reset для перезапуска сервера, чтобы мы могли иметь некоторую статистику с течением времени.

По крайней мере, у инструмента IBM PMAT нет проблем с анализом sysout с выходом GC.

Самое простое решение иногда лучше:)

Хотя я бы хотел, чтобы Java поддерживала поворот GC-журналов, как я вижу, кто-то обсуждал это раньше: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html

Ответ 2

Чтобы объяснить значение null, Java поддерживает внутреннюю ссылку, подсчитывая позицию для отступа, и по мере того, как вы перемещаете файл из-за того, что в журнал записываются нулевые символы.

Я видел, как я искал файлы журнала GC, чтобы вызвать сбою системы, прерывание, вызванное при записи в файл журнала, игнорируется (см. здесь код http://pastebin.com/HWkNv3PM), в результате чего JVM продолжает игнорировать ошибку.

Когда файл снова открывается, я считаю, что счетчик позиции не является reset.

Что касается других идей о том, как свернуть файлы журналов, см. также: Журналы коллекционирования мусора в java

Ответ 3

Простым обходным решением может быть изменение Java-запроса, который я использовал в моем вопросе:

java -Xloggc:/home/test/test.log -cp/home/test/Test

к

java -verbose: gc -cp/home/test/Test | tee -a/home/test/test/log

Конфигурация logrotate и cron может оставаться неизменной (даже если период cron должен быть увеличен).

Смотрите мой комментарий по вопросу о ссылке, в которой более подробно рассказывается о logrotate и обработчиках файлов в Linux. См. Также brainzzy объяснения о поведении Java.

Ответ 4

вместо java -verbose: gc → console.log можно сделать: java -Xloggc: logs/gc.log → console.log, поэтому вывод будет сохранен в файле, а затем также повернут в console.log?