So komprimieren und bereinigen Sie Protokolle mit logrotate, ohne sie zu drehen

10

Ich habe einen Tomcat-Server, der Zugriffsprotokolle über ein Ventil erstellt ( org.apache.catalina.valves.FastCommonAccessLogValve ). Dieses Ventil sorgt dafür, dass die Zugriffsprotokolldatei gedreht, aber nicht komprimiert oder nach einiger Zeit gelöscht wird.

Im Moment habe ich einen Cron-Job, mit find [...] -mtime +30 [...]dem die Protokolle komprimiert und gelöscht werden. Ich würde lieber logrotate verwenden, damit sich die Protokollrotation für alle Protokolle an einem zentralen Ort befindet. Ich mag es nicht, eine separate Lösung nur für Tomcat zu haben.

Ich habe versucht, die Dokumentation zu logrotate zu lesen, bin aber immer noch etwas verloren. Kann ich logrotate nur zum Komprimieren und Bereinigen von Protokolldateien verwenden? Wie würde ich das machen?

Oder gibt es ein Tomcat-Zugriffsprotokollventil, das Protokolldateien komprimiert und bereinigt?

Danke für deine Hilfe !

Guillaume
quelle
Übrigens: FastCommonAccessLogValve ist in 6.0 veraltet. Tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/…
Janning

Antworten:

16

Ziemlich einfach, dass ich solche Arbeiten gesehen habe.

Erstellen Sie in /etc/logrotate.d eine Datei mit dem Namen tomcat, die Folgendes enthält: -

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

Dies wird täglich ausgeführt , komprimiert die Datei und hat einen Wert von 7 Tagen ( 7 drehen ). copytruncate bedeutet, dass die Originaldatei kopiert und dann abgeschnitten wird, sodass Tomcat nicht neu gestartet werden muss. fehlendes ok wird nicht fehlerhaft, wenn es nicht da ist.

Das access.log-Ventil kann durch Hinzufügen von drehbar = falsch geändert werden, um nicht zu drehen: -

<Valve className="org.apache.catalina.valves.AccessLogValve
     ...
     ...
     suffix="log" rotatable="false" />
Decado
quelle
1
Mein Problem ist, dass mein Zugriffsprotokoll im Gegensatz zu Catalina.out bereits gedreht ist.
Guillaume
3
Okay, die Drehung des Zugriffsprotokolls kann deaktiviert werden, indem in den Valve-Argumenten rotatable = false festgelegt wird. Antwort geändert, um dies einzuschließen.
Decado
2

Geändertes TimP-Skript - Löschen sehr alter Dateien hinzugefügt, Scan nach alten komprimierten Dateien hinzugefügt.

#!/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.
quelle
1

Ich wollte die Tomcat-Konfiguration nicht ändern, also habe ich ein Skript erstellt, das die gedrehten Dateien komprimiert

#! / bin / bash
#
# TPP 2013-02-21
#
# Tomcat-Apps verwenden eine Vielzahl von Loggern, hauptsächlich log4j.
# Diese drehen sich im Widerspruch zu logrotate, dem Unix-Protokollrotationssystem. 
#
# Einige Dateien zB Catalina.out
# werden zu einem Backup gedreht, das ein Datum enthält, z. B. Catalina.2013-01-06.log
#, die dann mit bz2 auf Catalina.2013-01-06.log.bz2 komprimiert werden kann
#

cd / var / log / tomcat6

# 2013-02-21
DATE = `date --rfc-3339 = date`
JAHR = `Datum +% Y`

für f in $ (finde Catalina * | grep -v bz2 | grep -v '$ DATE' | grep $ YEAR)
tun
 echo "bzip2 $ f" 
 bzip2 $ f
erledigt

# Andere sind jedoch aktiv, während sie ein Datum enthalten
# damit wir alle finden und nicht die aktuellsten komprimieren
für l in 'localhost *' 'opt-db *' 'opt *' 'host-manager *' 'manager *'
tun
 vorherige exportieren =
 für f in $ (finde $ l | grep -v bz2 | sort)
 tun
  if ["$ {previous}"! = ""]
  dann
    echo "bzip2 $ {previous}" 
    bzip2 $ vorher
  fi
  Export zurück = $ f
 erledigt
erledigt

Ausfahrt 0

TimP
quelle
1

Es ist überraschend einfach. Sagen Sie logrotate einfach, welche Dateien Sie speziell drehen möchten. nocreateweist logrotate an, nach dem Verschieben der alten Datei keine leere Datei neu zu erstellen (wenn Sie Dateien in einen Unterordner drehen).

/var/log/tomcat/catalina.out.* { 
  daily 
  nocreate
  compress 
  missingok 
}
Andrew Lorien
quelle
0

Für die Komprimierung von local_access_log.YYYY-MM-DD.txt habe ich dieses Skript geschrieben, nachdem ich diesen Beitrag gesehen habe: -

#!/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
quelle