Compacte todos os arquivos de log do apache que não possuem nenhum link simbólico apontando para eles

2
  • Estou usando o cronolog para permitir a rotação dos arquivos de log do apache.
  • Estou usando o fail2ban para monitorar esses arquivos de log e proibi-los em caso de abuso.

  • Existe sempre um link simbólico access.log que é criado pelo cronolog e aponta para o arquivo de log atual.

  • Cada noite, eu corro um cron para comprimir os arquivos de log de ontem:

    find /var/log/apache2/ -daystart -mtime +0 \( -name "*access*.log" -or -name "*error*.log" \) -type f -exec gzip {} \;
    

O problema é que, para o site com pouco tráfego, o link simbólico access.log agora está inativo porque o arquivo para o qual ele estava apontando foi renomeado por gzip . O resultado é que o fail2ban desiste dessas cadeias porque não pode mais representar os arquivos.

A solução é apenas compactar os arquivos de log para os quais não há nenhum link simbólico apontando.

Encontrei-me uma maneira de fazê-lo, e funciona, mas gostaria de saber se existe uma maneira mais fácil de fazer, porque esta é realmente complicada e não muito rápida (a find em 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 {} \;
    
por Fox 31.07.2013 / 20:01

1 resposta

0

Possivelmente algo assim:

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

Pode ser necessário modificar, dependendo dos seus requisitos exatos e da localização dos arquivos.

    
por 27.09.2016 / 14:12