Доброго времени суток, господа. Столкнулся со следующей проблемой:
Почтовый сервер 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.: не хотелось бы использовать костыльные методы а-ля перезапуск скрипта и т.д.