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

#java #log4j2

#ява #log4j2 #java

Вопрос:

У меня есть несколько файлов журналов, которые я хочу ежедневно прокручивать и архивировать в gzips.

Соответствующая конфигурация выглядит следующим образом:

 <Appenders>
    <RollingFile name="MyLog"
                 fileName="${sys:log.dir}/mylog.log"
                 filePattern="${sys:log.dir}/mylog-%d{yyyy-MM-dd}.log.gz">
        <PatternLayout pattern="%d %p | %m | %c{1.} [%t]%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy/>
        </Policies>
    </RollingFile>
</Appenders>

<Loggers>
    <Root level="INFO">
        <AppenderRef ref="MyLog"/>
    </Root>
</Loggers>
  

Таким образом, каталог журнала может выглядеть следующим образом

 mylog-2020-01-01.log.gz
mylog-2020-01-02.log.gz
mylog-2020-01-03.log.gz
mylog.log  // todays logs (let's say its the 4th Jan)
  

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

Из-за характера того, что я регистрирую (связано с сеансами клиента), это может произойти значительно позже полуночи. Это могут быть часы или даже дни.

Было бы удобно иметь возможность ls просматривать файлы в каталоге журнала на интересующую меня дату. На данный момент я не могу сделать это надежно, потому что есть вероятность, что вчерашние журналы еще не были свернуты; в этом случае mylog.log это не журналы с сегодняшнего дня, а журналы со вчерашнего дня.

Есть ли способ настроить его так, чтобы он с готовностью, а не лениво, выполнял свертку файлов?

Я мог бы добавить cronjob для очистки, но я не решаюсь, потому что, если около полуночи происходит ведение журнала, я не хочу возиться с файлами, в которые log4j пытается записать. Похоже, что это было бы чревато ошибками.

Ответ №1:

Похоже, проблема в TimeBasedTriggeringPolicy

TimeBasedTriggeringPolicy Вызывает откат , когда шаблон даты / времени больше не применяется к активному файлу

Похоже, что политика на основе cron будет работать для меня

CronTriggeringPolicy Запускает опрокидывание на основе выражения cron. Эта политика управляется таймером и асинхронна с обработкой событий журнала, поэтому возможно, что события журнала за предыдущий или следующий период времени могут отображаться в начале или конце файла журнала

Ссылка на приложения

Для выполнения в полночь каждый день:

 <Policies>
    <CronTriggeringPolicy schedule="0 0 0 * * *"/>
</Policies>