Я использую fail2ban для отслеживания этих файлов журналов и блокировки в случае злоупотреблений.
Всегда есть access.log символическая ссылка, которая создается cronolog и указывает на текущий файл журнала.
Каждую ночь я запускаю cron для сжатия вчерашних файлов журнала:
find /var/log/apache2/ -daystart -mtime +0 \( -name "*access*.log" -or -name "*error*.log" \) -type f -exec gzip {} \;
Проблема в том, что для сайта с низким трафиком access.log символическая ссылка теперь мертва, потому что файл, на который она указывала, был переименован gzip
. В результате fail2ban отказывается от этих тюрем, потому что он больше не может обрабатывать файлы.
Решение состоит в том, чтобы сжимать только те файлы журналов, для которых нет символической ссылки.
Я нашел способ сделать это, и он работает, но я хотел бы знать, есть ли более простой способ сделать это, потому что он действительно сложен и не очень быстр ( find
в find
).
find /var/log/apache2/ -daystart -mtime +0 \( -name "*access*.log" -or -name "*error*.log" \) -type f -exec sh -c 'test `find /var/log/apache2/ -lname {} | wc -l` -eq 0' \; -exec gzip {} \;
Возможно что-то вроде этого:
LOGDIR=/path/to/log/files CURRENT=$(stat -c "%N" $LOGDIR/access.log | sed -e "s/.* -> //" -e "s/[\`']//g") for logfile in $(find $LOGDIR -type f -name \*.log) do if [ "$logfile" != "$LOGDIR/$CURRENT" ] then gzip $logfile fi done
Может потребоваться модификация в зависимости от ваших конкретных требований и расположения файлов.