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

Контекст:

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

Проблема:

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

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

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

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

  3. Я никогда не использовал ExternallyRolledFileAppender, но возможно ли использовать logrotate post rotate для отправки сигнала в ExternallyRolledFileAppender и сообщить log4j, что файл повернут, и начать запись в новый файл?

Вопрос:

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

11
задан Shengjie 24 May 2012 в 13:28
поделиться