Como comprimir e limpar logs com logrotate mas não os rode

9

Eu tenho um servidor Tomcat que cria logs de acesso por meio de uma válvula ( org.apache. catalina.valves.FastCommonAccessLogValve ). Essa válvula cuida da rotação do arquivo de log de acesso, mas não de compactá-los ou excluí-los após algum tempo.

No momento, tenho uma tarefa cron que usa find [...] -mtime +30 [...] para compactar e excluir os logs. Eu prefiro usar logrotate, para que a rotação de log esteja em um local centralizado para todos os logs. Eu não gosto de ter uma solução separada apenas para o Tomcat.

Eu tentei ler a documentação do logrotate, mas ainda estou um pouco perdido. Posso usar o logrotate apenas para compactar e limpar arquivos de log? Como eu faria isso?

Ou, voltando o problema, existe uma válvula de registro de acesso ao Tomcat que comprimirá e limpará os arquivos de log?

Obrigado pela sua ajuda!

    
por Guillaume 15.03.2011 / 12:27

6 respostas

15

Bastante simples que eu já vi funciona assim.

Crie um arquivo em /etc/logrotate.d chamado tomcat contendo o seguinte: -

/var/log/tomcat/catalina.out { 
  copytruncate 
  daily 
  rotate 7 
  compress 
  missingok 
}

Isso roda dia-a-dia , comprime o arquivo e permanece valendo 7 dias ( rotacionar 7 ). copytruncate significa que ele copiará e truncará o arquivo original para que não haja necessidade de reiniciar o tomcat. falta ok não irá cometer erros se não estiver lá.

A válvula access.log pode ser alterada para não girar adicionando rotatable = false: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />
    
por 15.03.2011 / 13:50
2

Script do TimP modificado - adicionado a exclusão de arquivos muito antigos, adicionada a verificação de arquivos compactados antigos.

#!/bin/bash
#
# TPP 2013-02-21
# RJK 2014-08-14
#
# Tomcat apps use a variety of loggers, mostly log4j.
# These rotate, conflicting with logrotate, the unix log rotation system.
#
# Some files eg catalina.out
# are rotated to a backup containing a date eg catalina.2013-01-06.log
# which can then be compressed with bz2 to catalina.2013-01-06.log.bz2
# or removed if older than a given number of days(MTIME).
#
cd /var/log/tomcat6
# 2013-02-21
DATE='date --rfc-3339=date'
YEAR='date +%Y'
MILLENIUM=20
# 2014-08-14
MTIME=14
# 2014-08-14
#for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $YEAR)
for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $MILLENIUM)
do
 # 2014-08-14
 if test 'find $f -mtime +$MTIME'
 then
   echo "rm -f $f"
   rm -f $f
 else
   echo "bzip2 $f"
   bzip2 $f
 fi
done
# However others are active whilst containing a date
# so we will find all and not compress the most recent
for l in 'localhost*' 'opt-db*' 'opt*' 'host-manager*' 'manager*'
do
 export previous=
 for f in $(find $l |grep -v bz2 |sort)
 do
  if [ "${previous}" != "" ]
  then
    echo "bzip2 ${previous}"
    bzip2 $previous
  fi
  export previous=$f
 done
done
# 2014-08-14
for f in $(find *bz2)
do
 if test 'find $f -mtime +$MTIME'
 then
   echo "rm -f $f"
   rm -f $f
 fi
done
exit 0 
    
por 14.08.2014 / 19:02
1

É surpreendentemente simples. Apenas diga ao logrotate quais arquivos você deseja especificamente rodar. nocreate diz ao logrotate para não recriar um arquivo vazio depois de mover o antigo (se você estiver girando arquivos para uma subpasta).

/var/log/tomcat/catalina.out.* { 
  daily 
  nocreate
  compress 
  missingok 
}
    
por 07.04.2017 / 04:44
1

Eu não queria mudar a configuração do Tomcat, então criou um script que comprimia os arquivos girados

#!/bin/bash
#
# TPP 2013-02-21
#
# Tomcat apps use a variety of loggers, mostly log4j.
# These rotate, conflicting with logrotate, the unix log rotation system. 
#
# Some files eg catalina.out
# are rotated to a backup containing a date eg catalina.2013-01-06.log
# which can then be compressed with bz2 to catalina.2013-01-06.log.bz2
#

cd /var/log/tomcat6

# 2013-02-21
DATE='date --rfc-3339=date'
YEAR='date +%Y'

for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $YEAR)
do
 echo "bzip2 $f" 
 bzip2 $f
done

# However others are active whilst containing a date
# so we will find all and not compress the most recent
for l in 'localhost*' 'opt-db*' 'opt*' 'host-manager*' 'manager*'
do
 export previous=
 for f in $(find $l |grep -v bz2 |sort)
 do
  if [ "${previous}" != "" ]
  then
    echo "bzip2 ${previous}" 
    bzip2 $previous
  fi
  export previous=$f
 done
done

exit 0

    
por 21.02.2013 / 18:50
0

Para compactação local_access_log.YYYY-MM-DD.txt Eu escrevi este script depois de ver este post: -

#!/bin/bash
#
# If Tomcat uses server.xml config to rotate localhost_access_log,
# the daily rotated logs will need compressing and old ones deleted to stop filling
# the log partiton. Cannot use the system logrotate command as conficts with tomcat rotate
# therefore run this script in a daily cronjob
#
# localhost_access_log.2015-09-03.txt
#
# Add this script in /etc/cron.daily/ owned by root
#

CATALINA_BASE='ps aux | grep catalina.base | awk -F'catalina.base\=' '{print $2}' | awk '{print $1}''

if [ ! $CATALINA_BASE ]
then
    if [ -r /var/lib/tomcat8 ]
    then
        CATALINA_BASE=/var/lib/tomcat8
    else
        echo "Error: cannot find CATALINA_BASE"
        exit 1
    fi
fi

cd ${CATALINA_BASE}/logs

if [ $? -ne 0 ]
then
    echo "Error, cannot cd to logs directory, quitting...."
    exit 1
fi

# today's date (not to be gzipped)
DATE='date --rfc-3339=date'
# number of days to keep
MTIME=28

# Compress all previous days uncompressed logs
for log in 'ls localhost_access_log* | grep -v bz2 | grep -v $DATE'
do
    bzip2 $log
done

# delete old logs
find . -name "*.bz2" -mtime +$MTIME -exec rm {} \;

exit 0
    
por 07.09.2015 / 13:12
0

Solução simples fornece aqui. Isso também inclui a opção de upload s3.

link

    
por 11.01.2017 / 23:10