Die Log Dateien von den nginx Webserver waren riesig. Teilweise mehrere Gigabyte groß. Wie verkleinert man nun diese Dateien und warum hat das logrotate nicht funktioniert? Seit 2017 haben sich die Webserver Logs in einer einzigen Datei angesammelt.
Gigabyte große nginx Log Dateien
mattionline:/var/log/nginx# ls -la
insgesamt 5053388
drwxr-xr-x 2 root root 4096 Jun 14 12:29 .
drwxr-xr-x 11 root root 4096 Jul 26 00:00 ..
-rw-r----- 1 mattionline adm 3583205973 Jul 31 18:25 access.log
-rw-r----- 1 mattionline adm 937822 Sep 21 2017 access.log.1
-rw-r----- 1 mattionline adm 201270 Sep 20 2017 access.log.2.gz
-rw-r----- 1 mattionline adm 89529 Sep 18 2017 access.log.3.gz
-rw-r--r-- 1 root root 35003 Sep 17 2017 access.log.4.gz
-rw-r----- 1 mattionline adm 1588523617 Jul 31 18:19 error.log
-rw-r----- 1 mattionline adm 1447742 Sep 21 2017 error.log.1
-rw-r----- 1 mattionline adm 113693 Sep 20 2017 error.log.2.gz
-rw-r----- 1 mattionline adm 47862 Sep 18 2017 error.log.3.gz
-rw-r--r-- 1 root root 17378 Sep 17 2017 error.log.4.gz
mattionline:/var/log/nginx# du -sh *
3,4G access.log
920K access.log.1
200K access.log.2.gz
88K access.log.3.gz
36K access.log.4.gz
1,5G error.log
1,4M error.log.1
112K error.log.2.gz
48K error.log.3.gz
20K error.log.4.gz
Anlegen des logrotate Skripts
Ich habe festgestellt, dass es überhaupt kein logrotate Skript für den nginx Webserver gab. Logrotate geht täglich durch die Logs durch und verkleinert die Dateien. Am Ende werden komprimierte gz (vergleichbar mit zip) Dateien erstellt. Somit besitzen die Bruchstücke der log Dateien nur noch eine Megabyte Größe und wachsen nie wieder in den Gigabyte Bereich rein.
Anlegen des logrotate Skripts:
Inhalt der Datei:
(Den Benutzer mattionline mit dem jeweiligen Webserver Nutzer ersetzen. Dieser ist in der /etc/nginx/nginx.conf Datei einstellbar. Die user Variable.)
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 mattionline mattionline
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Starten von logrotate
Um logrotate manuell zum Laufen zu bekommen folgenden Befehl ausführen:
logrotate -d /etc/logrotate.d/nginx // d für debug ohne wirkliche ausführung
logrotate -f /etc/logrotate.d/nginx // f für force - tatsächliche ausführung
Fazit
Nachdem ich die Force Kommandozeile ein paar mal manuell ausgeführt habe, wurden viele kleine gz Dateien angelegt. Die Größe ist von 3GB auf maximal 300MB gefallen. Statt einer riesen Log Datei werden die alten nach und nach archiviert und verkleinert.
mattionline:/var/log/nginx# du -sh *
40K access.log
4,0K access.log.1
36K access.log.10.gz
4,0K access.log.2.gz
4,0K access.log.3.gz
4,0K access.log.4.gz
4,0K access.log.5.gz
302M access.log.6.gz
112K access.log.7.gz
200K access.log.8.gz
88K access.log.9.gz
4,0K error.log
4,0K error.log.1
4,0K error.log.2.gz
4,0K error.log.3.gz
4,0K error.log.4.gz
53M error.log.5.gz
72K error.log.6.gz
112K error.log.7.gz
48K error.log.8.gz
20K error.log.9.gz
Problem gelöst. Log Dateien verkleinert. Keine mehr von dem Jahr 2017.
Weitere Informationen zur Funktionsweise von logrotate: