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.
Hallo Tronde
ich habe Access Log und Error Log aktiviert. Hat auch bisher funktioniert.
Nun wird die access.log Datei nur aktualisiert wenn ich nginx restart mache oder reload.
Wenn nginx läuft wird die Datei nicht aktualisiert. Buffer verwende ich nicht
Habe nginx bereits neu installiert
Hallo Holger,
was genau meinst du mit „aktualisiert“? Schreibt dein NGINX nichts ins access log oder wird dieses nicht durch logrotate rotiert?
Ich sehe gerade, dass das Code-Listing des Logrotate-Scripts nicht korrekt dargestellt wird. Ich poste dir hier die Konfiguration von einem meiner Server, in der Hoffnung, dass der Code diesmal korrekt dargestellt wird:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
Ich hoffe dies hilft dir weiter.
MfG
Tronde