Comment compresser et nettoyer les journaux avec logrotate mais pas les faire pivoter

10

J'ai un serveur Tomcat qui crée des journaux d'accès via une valve ( org.apache.catalina.valves.FastCommonAccessLogValve ). Cette valve se charge de faire tourner le fichier journal d'accès, mais pas de les compresser ou de les supprimer après un certain temps.

Pour l'instant, j'ai un travail cron qui utilise find [...] -mtime +30 [...]pour compresser et supprimer les journaux. Je préfère utiliser logrotate, afin que la rotation des journaux soit centralisée pour tous les journaux. Je n'aime pas avoir une solution séparée juste pour Tomcat.

J'ai essayé de lire la documentation logrotate, mais je suis toujours un peu perdu. Puis-je utiliser logrotate uniquement pour compresser et nettoyer les fichiers journaux? Comment ferais-je ça?

Ou pour contourner le problème, existe-t-il une vanne de journal d'accès Tomcat qui compressera et nettoiera les fichiers journaux?

Merci pour votre aide!

Guillaume
la source
BTW: FastCommonAccessLogValve est déconseillé dans 6.0 tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/…
Janning

Réponses:

17

Assez simple que j'ai vu fonctionne comme ça.

Créez un fichier dans /etc/logrotate.d appelé tomcat contenant les éléments suivants: -

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

Cela s'exécute quotidiennement , comprime le fichier et en vaut 7 jours ( tournez 7 ). copytruncate signifie qu'il copiera puis tronquera le fichier d'origine afin qu'il ne soit pas nécessaire de redémarrer tomcat. manquant ok ne fera pas d'erreur s'il n'est pas là.

La valve access.log peut être modifiée pour ne pas tourner en ajoutant rotatable = false: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />
Decado
la source
1
Mon problème est que contrairement à catalina.out, mon journal d'accès est déjà tourné.
Guillaume
3
D'accord, la rotation du journal d'accès peut être désactivée en définissant rotatable = false dans les arguments Valve. Répondu pour l'inclure.
2011
2

Script de TimP modifié - Ajout de la suppression des très anciens fichiers, ajout de l'analyse des anciens fichiers compressés.

#!/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 
Rich K.
la source
1

Je ne souhaitais pas changer la configuration de Tomcat, j'ai donc créé un script qui a compressé les fichiers tournés

#! / bin / bash
#
# TPP 2013-02-21
#
# Les applications Tomcat utilisent divers enregistreurs, principalement log4j.
# Ceux-ci tournent, en conflit avec logrotate, le système de rotation des journaux unix. 
#
# Certains fichiers, par exemple catalina.out
# sont tournés vers une sauvegarde contenant une date, par exemple catalina.2013-01-06.log
# qui peut ensuite être compressé avec bz2 en catalina.2013-01-06.log.bz2
#

cd / var / log / tomcat6

# 2013-02-21
DATE = `date --rfc-3339 = date`
ANNÉE = `date +% Y`

pour f en $ (trouver catalina * | grep -v bz2 | grep -v '$ DATE' | grep $ YEAR)
faire
 echo "bzip2 $ f" 
 bzip2 $ f
terminé

# Cependant, d'autres sont actifs tout en contenant une date
# donc on va tout trouver et pas compresser les plus récents
pour l dans 'localhost *' 'opt-db *' 'opt *' 'host-manager *' 'manager *'
faire
 exportation précédente =
 pour f dans $ (trouver $ l | grep -v bz2 | sort)
 faire
  if ["$ {previous}"! = ""]
  puis
    echo "bzip2 $ {previous}" 
    bzip2 $ précédent
  Fi
  exportation précédente = $ f
 terminé
terminé

sortie 0

TimP
la source
1

C'est étonnamment simple. Dites simplement à logrotate quels fichiers vous souhaitez spécifiquement faire pivoter. nocreateindique à logrotate de ne pas recréer un fichier vide après avoir déplacé l'ancien (si vous faites pivoter des fichiers dans un sous-dossier).

/var/log/tomcat/catalina.out.* { 
  daily 
  nocreate
  compress 
  missingok 
}
andrew lorien
la source
0

Pour la compression local_access_log.YYYY-MM-DD.txt, j'ai écrit ce script après avoir vu ce 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
John Cooper
la source