Как вращать логи при каждом завершении работы сервера в log4j2

Прямо сейчас я чередую журналы, используя log4j2, если он достигает 2000 МБ и по времени, то есть каждый час со следующей логикой: -

<RollingRandomAccessFile name="test"
            fileName="${sys:log4j.logPath}/testlog" filePattern="${sys:log4j.logPath}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{ISO8601} %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="1990 MB" />
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>

Я также хочу, чтобы журналы менялись при выключении сервера. какую конфигурацию я должен добавить к следующему?

Я использовал OnStartupTriggeringPolicy для ротации журналов при завершении работы. Но ротация журналов выполняется после одного запроса с перезапуском сервера.

Но я хочу, чтобы мои журналы менялись при выключении сервера. Есть способ сделать это?


person Galet    schedule 10.06.2016    source источник
comment
возможно, посмотрите здесь: [stackoverflow.com/questions/1444520/ (хотя я не Я полностью понимаю, что ты хочешь)   -  person Maurice Müller    schedule 10.06.2016


Ответы (2)


Заголовок вашего вопроса - повернуть журналы при перезапуске сервера, но ваш вопрос - повернуть журналы при завершении работы. Ротация журнала при завершении работы ненадежна, потому что файл не будет вращаться в случае сбоя сервера или системы. Можно реализовать функцию отката при нормальном завершении работы, но для этого вам нужно будет создать задачу Jira для Log4j.

Log4j 2 поддерживает OnStartupTriggeringPolicy. Это приведет к переворачиванию файла при запуске сервера, если файл не пуст.

person rgoers    schedule 10.06.2016
comment
Я обновил свое название. Я также пробовал OnStartupTriggeringPolicy. Его срабатывание и журнал записываются, когда мы делаем первый запрос после перезапуска сервера. Но мне нужно повернуть журнал при выключении, например, блок finally в java. - person Galet; 13.06.2016
comment
Чтобы запросить это, создайте задачу Jira. - person rgoers; 13.06.2016

Я нашел решение вышеуказанной проблемы. Для меня работает следующий код.

Добавьте 'shutdownHook = "disable"' в log4j.xml

<Configuration status="WARN" shutdownHook="disable">

Метод для rollover (): -

public class RollOverLog4j {

    public static void rollover() {
        public final Logger logger = LogManager.getLogger("test");

        Map<String, Appender> appenders = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
        Iterator<Entry<String, Appender>> appenderIterator = appenders.entrySet().iterator();
        while (appenderIterator.hasNext()) {
            Appender appender = appenderIterator.next().getValue();
            if (appender instanceof RollingRandomAccessFileAppender) {
                ((RollingRandomAccessFileAppender) appender).getManager().rollover();
            }
        }
    }

}

Ролловер вызова () при остановке сервера: -

RollOverLog4j.rollover()
// shutting down log4j manually
Configurator.shutdown((LoggerContext) LogManager.getContext());

Примечание. - rollover () не является общедоступным методом в версии log4 2.3. Так что используйте последнюю версию 2.6, чтобы она работала.

person Galet    schedule 15.06.2016