Log4j fileappender не переключается на новый файл, когда logrotate вращает файл журнала

Контекст:

Я хочу использовать log4j для записи журналов, связанных с аудитом, в конкретный файл журнала, скажем, audit.log. Я не хочу использовать syslogappender (на основе udp), потому что я не хочу быть терпимым к потере данных. Кроме того, я использую logrotate для поворота audit.log, когда файл достигает определенного размера.

Проблема:

Я сталкиваюсь с тем, что, когда logrotate вращает файл audit.log на audit.log.1, log4j продолжает писать в audit.log.1, кроме записи в audit.log.

Возможные подходы:

  • Я знаю, что я могу использовать rollfileappender для вращения журнала, кроме использования logrotate, поэтому, когда rollfileappender закачивает файл, он переключается на новый файл без проблем. Но причина, по которой я не могу использовать rollfileappender, заключается в том, что я хочу использовать функцию поворота postrotate после запуска, когда запускаются некоторые скрипты, которые не могут быть предоставлены функцией rollfileappender.

  • Другим отчаянным способом, о котором я могу думать, является написать собственный пользовательский файл log4j, чтобы закрыть файл журнала (audit.log.1) и открыть новый (audit.log), когда он обнаруживает, что файл повернут,

  • Я никогда не использовал ExternallyRolledFileAppender, но если можно использовать post rotateFileAppender, чтобы отправить сигнал в ExternallyRolledFileAppender и сделать log4j осведомленным о том, что файл повернут и начать запись в новый файл?

Вопрос:

Просто интересно, есть ли какой-нибудь appender, который уже был изобретен/написан? или у меня есть другие варианты для решения этой проблемы?

Ответ 1

Проверьте logrotate copytruncate вариант, это может помочь вашему делу:

copytruncate
       Truncate the original log file to zero size  in  place
       after  creating  a copy, instead of moving the old log 
       file and optionally creating a new  one.   It  can  be  
       used  when  some  program  cannot be told to close its 
       logfile and thus might continue writing (appending) to
       the  previous  log file forever.  Note that there is a
       very small time slice between  copying  the  file  and 
       truncating  it,  so  some  logging data might be lost.
       When this option is used, the create option will  have
       no effect, as the old log file stays in place