Роллинг мусора сборщик логов в Java - PullRequest
41 голосов
/ 29 сентября 2010

Можно ли выполнять сверку журналов сборщика мусора в Sun JVM?

В настоящее время я генерирую журналы, используя:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 

Но я должен вручную вращать их, используя очереди fifo иrotatelogs, чтобы создать новый журнал для каждого дня.Я надеюсь, что есть лучшее решение для этого.

Может быть, есть способ получить доступ к этим записям журнала изнутри java, чтобы я мог перенаправить их в log4j?

Редактировать: решение с fifoОчередь недостаточно хороша, потому что если процесс, который читает из этой очереди (например, rotatelogs), читает медленно, это приведет к замедлению всего jvm (по-видимому, Sun / Oracle выполняет синхронное ведение журнала gc)

Ответы [ 5 ]

82 голосов
/ 05 сентября 2012

Встроенная поддержка ротации журнала GC была добавлена ​​в JSM HotSpot.Он описан в RFE 6941923 и доступен в:

Для его включения и настройки можно использовать три новых флага JVM:

  • -XX:+UseGCLogFileRotation
    должен использоваться с -Xloggc:<filename>;
  • -XX:NumberOfGCLogFiles=<number of files>
    должен быть> = 1, по умолчанию один;
  • -XX:GCLogFileSize=<number>M (or K)
    по умолчанию будет установлено 512K.
6 голосов
/ 22 апреля 2013

Если вы не можете обновить версию Java, чтобы использовать новые флаги для вращения журнала gc, тогда вы можете указать другой файл gc при каждом запуске приложения:

JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M`

При ссылке на setenv, обычно при запуске или завершении работы, он ссылается на другой файл журнала. В unix это можно использовать как метод «вращения» журнала.

3 голосов
/ 07 сентября 2012

Вы пробовали эти новые опции?

Я пробовал jdk7u7, jdk7u6 и jdk6u35 так:

java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M

, но с каждой версией я вижу эту ошибку:

Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Исправление # 6941923 для 7u2ссылка здесь: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

1 голос
/ 02 марта 2016

Интересным подходом было бы перенаправить gc.log на именованный канал -Xloggc:/my/named/pipe Как записать журнал GC в именованный канал

затем прочитайте этот канал из самого приложения: Как открыть именованный канал Windows из Java?

и войдите в произвольный (например, асинхронный скользящий) logger logger из кода.

Попробовал это на машине с Windows. К сожалению, установка в Windows сложнее, чем в Linux.

В Windows он работает в основном с помощью дополнительного скрипта Powershell (также может быть выделенным приложением). Этот пример проекта также содержит демонстрационное приложение, которое можно сразу же использовать для проверки перенаправления журналов GC на Logback через SLF4J.

0 голосов
/ 23 апреля 2018

Я решил эту проблему, создав новый поток в моем приложении и периодически посылая команду jcmd log-rotate (на основе выражения cron).

Это нетрадиционный подход, так как вы будете использовать Oracle Attach API , хотя этот подход послужил нашему сценарию использования ротационных журналов GC каждый час.

...