In diesem Artikel wird beschrieben, wie ich das Logging und logrotate
meines NGINX-Servers konfiguriert habe. Dabei gehe ich kurz auf die beiden verwendeten Direktiven error_log
und ngx_http_log_module
ein.
Damit dient dieser Artikel meiner Dokumentation und evtl. euch als Anregung, ein eigenes Logging zu konfigurieren.
Logging
Informationen zum Logging findet man in der offiziellen NGINX-Dokumentation.[1. NGINX-Dokumentation] Im folgenden werden die Direktiven error_log
[2. NGINX core module error_log] und ngx_http_log_module
[3. NGINX – ngx_http_log_module] verwendet.
Mein Server liefert mehrere Webseiten aus. Ich möchte gern für jede Webanwendung ein separates Error-Log und Access-Log schreiben. Dabei wird folgendes Muster verwendet:
- Log-Verzeichnis: /var/www//logs
- Name für
error_log
: _error.log - Name für
access_log
: _access.log
Konfiguration des Error-Log
Die Error_log-Syntax ist denkbar einfach:
error_log log_file [ log_level ]
log_file
gibt den Pfad zur Log-Datei an. Mit log_level
wird bestimmt, wie viele Informationen protokolliert werden sollen.
Log-Level[4. How To Configure Logging and Log Rotation in Nginx on an Ubuntu VPS]
- emerg: Notfall, in dem sich das System in einem nicht nutzbaren Zustand befindet
- alert: Ernste Störung. Sofortiger Eingriff ist erforderlich
- crit: Kritische Probleme, um die man sich kümmern sollte
- error: Ein Fehler ist aufgetreten. Hier funktioniert etwas nicht
- warn: Ein ungewöhnliches Ereignis ist aufgetreten. Dies ist jedoch kein Grund zur Sorge
- notice: Normale Vorgänge werden ebenfalls protokolliert
- info: Unnützes Wissen – Nice to know
- debug: Debugging-Informationen, welche helfen, ein Problem näher zu analysieren
Die Log-Level sind nach Priorität angeordnet. Wird das Level auf „error“ gesetzt, so werden alle Events der Level error, crit, alert und emerg protokolliert.
Möchte man rein gar nichts protokollieren, muss das Log nach /dev/null umgeleitet werden.
error_log /dev/null crit;
Konfiguration des Access-Log
Das Modul ngx_http_log_module
besteht aus den Direktiven access_log
, log_format
und open_log_file_cache
, von denen ich hier nur die ersten beiden verwenden werde.
Mit der Direktive log_format
kann das Format der Log-Dateien konfiguriert werden. Die einzelnen Formate werden über einen Bezeichner ausgewählt. Dies kann z.B. wie folgt aussehen:
log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; access_log /spool/logs/nginx-access.log compression buffer=32k;
Eine detaillierte Beschreibung aller verfügbaren Parameter kann der offiziellen Dokumentation entnommen werden.[5. NGINX -log_format]
Ich selbst verwende aktuell ausschließlich das Format combined. Dieses ist bereits in der Standardinstallation enthalten. Es sieht wie folgt aus:
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
Für die Protokollierung meiner Webanwendungen wird daher folgendes in die jeweiligen Server-Direktiven eingetragen:
server { ... access_log /var/www//logs/_access.log combined; ... }
Falls man das Access-Log deaktivieren möchte, kann man dies durch den folgenden Eintrag erreichen:
access_log off;
Nun werden schon mal alle Log-Dateien nach Webanwendungen getrennt in das Verzeichnis /var/www//logs geschrieben.
Im nächsten Abschnitt gehe ich darauf ein, wie man verhindert, dass die Festplatte mit Log-Dateien vollgeschrieben wird.
Rotation der NGINX Log-Dateien
Zum Rotieren der Logs verwende ich die Anwendung logrotate
. Diese ist bei Ubuntu bereits in der Standardinstallation enthalten.
Es wird ein Skript im Verzeichnis /etc/logrotate.d erstellt und folgender Inhalt eingefügt.
/var/www//logs/*.log { daily missingok rotate 31 compress delaycompress notifempty sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
Mit diesem Skript wird logrotate
angewiesen, die Log-Dateien im Verzeichnis /var/www//logs/ täglich zu rotieren und die letzten 31 Log-Dateien zu behalten. Die Log-Datei wird nicht rotiert, falls sie leer ist, also keine Einträge enthält. Die älteren Dateien werden dabei komprimiert, um Speicherplatz zu sparen.
Die generelle Beschreibung von logrotate
würde den Rahmen dieses Artikels sprengen. Weitere Informationen sind in der Manpage zu finden.[6. logrotate(8) – Linux man page]
Damit ist der verspätete Frühjahrsputz auf diesem Server beendet.