Сжать все файлы журнала 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
  фи
сделанный

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

Другие вопросы по тегам