7

Проблема ротации логов в Zimbra

Доброго времени суток, господа. Столкнулся со следующей проблемой:

Почтовый сервер Zimbra. Интересующий лог файл: audit.log. Его ротация происходит при помощи log4j из комплекта почтовика. Вот дефолтный конфиг:

/opt/zimbra/conf/log4j.properties

# Appender AUDIT writes to the file "audit.log".

log4j.appender.AUDIT=org.apache.log4j.rolling.RollingFileAppender

log4j.appender.AUDIT.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy

log4j.appender.AUDIT.RollingPolicy.FileNamePattern=/opt/zimbra/log/audit.log.%d{yyyy-MM-dd}

log4j.appender.AUDIT.File=/opt/zimbra/log/audit.log

log4j.appender.AUDIT.layout=com.zimbra.common.util.ZimbraPatternLayout

log4j.appender.AUDIT.layout.ConversionPattern=%d %-5p [%t] [%z] %c{1} - %m%n

Для работы с данным логом я написал небольшой баш скрипт, который отлавливает сообщения о неудачной попытке авторизации и отправляет их мне в ТГ:

#!/bin/bash

logfile="/opt/zimbra/log/audit.log"

tail -f "$logfile" | while IFS= read -r line; do

if [[ "$line" == *"error=authentication failed for"* ]]; then

...

<разные действия + отправка в ТГ>

...

fi

done

Проблема заключается, как я понял, в том, что во время ротации файлов, log4j переименовывает текущий audit.log в audit.log.%d{yyyy-MM-dd}, затем создает новый файл с именем audit.log и пишет новые события туда. Поскольку создается новый файл, то соответственно и меняется его дескриптор, tail же висит на старом файле, со старым дескриптором и после 12 ночи перестает получать новые события. Как можно обойти данный момент? Есть ли в log4j что-то вроде опции truncate из logrotate, которая не создавала бы новый файл, а копировала текущий и затем очищала его, дабы дескриптор не изменился и tail продолжил работать?

Буду благодарен за ответы.

P.S.: не хотелось бы использовать костыльные методы а-ля перезапуск скрипта и т.д.

Лига Сисадминов

2.3K постов18.8K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.