Tip des Tages: Öfters mal Logfiles rotieren

Tomcat Logfiles können lang werden, daher sollte man diese desöftern rotieren.

Ganz unproblematisch ist das beim Tomcat aber nicht, denn im Gegensatz zu PHP Webanwendungen, stehen hier die Sessioninfos im RAM und nicht auf der Platte. Das hat beim Tomcat einen enormen Vorteil, weil der Server deutlich schneller an Infos kommt, als es z.B. PHP kann.

Der Nachteil liegt auf der Hand:  ein Neustart zerstört auch immer die Sessioninformationen. Gerade bei Shops ist das ein Problem. Hier muß die Sessionverwaltung dann auf Datenbanken ausgelagert werden, was bei verteilten Webanwendungen ohnehin gemacht werden muß.

Wo würde man daher das Logrotate ansetzen ?

Wer Serverdienste einsetzt, der braucht auch immer ein Startscript. Tomcat kommt zwar mit seinem eigenen startup.sh daher, aber auf ein klassisches Startscript ala init.d kann man eigentlich nicht verzichten. Hier ein Ausschnitt:

export CATALINA_HOME=/java/tomcat

ulimit -v unlimited -d unlimited -s unlimited -n 20000

PATH=$PATH:/usr/local/bin/

# See how we were called.
case "$1" in
 start)
 echo -n "Starting tomcat : "
 daemon /java/tomcat/bin/startup.sh
 RETVAL=$?
 echo
 ;;
 stop)
 echo -n "Stopping tomcat : "
 killtomcat
 RETVAL=$?
 echo
 ;;
 status)
 status tomcat
 RETVAL=$?
 ;;
 restart)
 $0 stop
 $0 start
 RETVAL=$?
 ;;
 *)
 echo "Usage: tomcat {start|stop|status|restart}"
 exit 1
esac

exit $RETVAL

und genau hier setzen wir an :

# See how we were called.
case "$1" in
 start)
 echo -n "Rotating Logs : "
 cd /usr/java/apache-tomcat/logs/
 echo "Deleting old files : "
 find . -ctime +100 -name "catalina.out*" -exec rm -fv {} \;
 COUNTER=0
 while [ $COUNTER -lt 99 ]; do
       echo The counter is $COUNTER
       let COUNTER=COUNTER+1
       if [ ! -f "catalina.out.$COUNTER" ]; then
           FILENAME="catalina.out.$COUNTER";
           break;
       fi
 done
 echo "Benutze $FILENAME";
 mv catalina.out $FILENAME
 echo "Compressing Logfile : $FILENAME"
 bzip2 -9 $FILENAME
 echo -n "Starting tomcat : "
 daemon /java/tomcat/bin/startup.sh
 RETVAL=$?
 echo
 ;;

Dieses Script ist natürlich nur ein Beispiel. Ihr müßt es noch anpassen an Eure Pfade und Präferenzen. Es wird Logfiles löschen, die älter als 100 Tage sind und maximal bis .99 zählen. Das kann je nach Häufigkeit des Starts Eures Tomcats dann eventuell nicht passen. Da müßt Ihr jetzt Eure Erfahrungen für Eurer System berücksichtigen.

Bitte beachtet, daß BZIP2 ein echter Zeitfresser ist, besonders in der Kombination mit 8 GB Logfile und -9 Option. Das packt hier auf einem nicht langsamen Server bereits seit 50 MInuten 😉 Das Ergebnis ist allerdings genial:

catalina.out.5: 53.987:1, 0.148 bits/byte, 98.15% saved, 8.250.838.531 in, 152.828.685 out.

Unter 2 % sind vom Logfile übrig geblieben 🙂

Wer jetzt meint, daß dieser Beitrag den 50 Minuten geschuldet ist, hat recht 😀 War leider ein echter Blocker.

 

Systemd: wie man Journals sicher verkleinert

Privat wird man das Problem eher seltener anfinden, aber wenn man eine Linux Serverfarm betreibt, kommt es häufiger vor, daß Server wenig Platz auf den Platten melden. I.d.R. passiert das unabsichtlich, weil irgendwelche Logfiles oder selbstgebauten Sicherungssysteme der Kunden jeden Tag Daten auf die Platte kippen, welche die Kunden schon lange vergessen haben.

Bei der Suche nach Platz benutzt man auf einem Server eher selten Baobab, dafür meistens „du -sh /*|grep G“ .

Irgendwann bei der Suche, stolpert man über die großen Mengen Speicherplatz die in /var/log verwendet werden und hier ist i.d.R. der Syslogd der Platzkiller. Nun will man natürlich auch ältere Logs haben, damit darin nach Fehlern suchen kann. Insofern ist es ok, wenn die Logs etwas größer sind. Damit man aber schnell mal 2 GB Platz auf der Platte für andere Sachen gewinnt, kann man z.b. folgende Befehle benutzen:

journalctl --vacuum-time=10d
journalctl --vacuum-size=1G

Der erste Befehl löscht alle Logs, die älter als 10 Tage sind. Der zweite Befehl löscht alles weg, was mehr als 1 GB belegt. Ein 1 GB Log sollte für alle jüngeren Problemfälle reichen.

Jetzt könnte man die Größe des Logfiles in der Systemd Konfiguration dauerhaft hinterlegen, oder man nutzt den freien Platz nur temporär. Wenn man sich für letzteres entscheidet, darf man das Problem nicht auf die Lange Bank schieben, sondern sollte schnellstmöglich eine Entlastung der Platte durch Löschen anderer Daten herbeiführen.