Сжать все файлы журнала apache, на которые нет символической ссылки, указывающей на них
- Я использую cronolog, чтобы позволить файлам журнала apache вращаться.
Я использую 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 {} \;
1 ответ
Возможно что-то вроде этого:
LogDir =/ путь / к / Журнал / файлы CURRENT=$(stat -c "%N" $LOGDIR/access.log | sed -e "s/.* -> //" -e "s/[\`']//g") для файла журнала в $ (найдите $LOGDIR -type f -name \*.log) делать if [ "$logfile"!= "$LOGDIR/$CURRENT" ] затем gzip $logfile фи сделанный
Может потребоваться модификация в зависимости от ваших точных требований и расположения файлов.