nginx: Logging für bestimmte Anfrage(n) deaktivieren

Sofern in einer server-Direktive angegeben, speichert nginx alle Anfragen in einer Logdatei ab. Will man bestimmte Anfragen, beispielsweise mit dynamischen Parametern, von dieser Speicherung ausnehmen, ist das nicht ganz so einfach. Aus diesem Grunde möchte ich hier eine Möglichkeit aufzeigen, wie das ab nginx 1.7.0 funktioniert. Die dafür genutzte map-Funktion gibt es in älteren nginx-Versionen leider nicht.

Zuerst einmal muss man natürlich die Anfrage wählen, für die man das Logging deaktivieren möchte. In meinem Fall war das die /board/index.php?page=ChatMessageBot&id=X, wobei X immer eine dynamisch fortlaufende Zahl ist. Hat man als ungewollt geloggte Anfrage nur ein Verzeichnis oder eine Datei direkt, geht es ganz einfach, indem man folgendes in die server-Direktive einträgt:

location /do-not-log.txt { access_log off; }

Bei einer dynamischen Anfrage oder auch einer Anfrage mit Parametern geht es nicht mehr so einfach. Dafür gibt es dann aber die besagte map Funktion. Deren Aussehen ist in diesem konkreten Fall die folgende und wird außerhalb der server-Direktive gespeichert:

map $request_uri $loggable { ~/board/index\.php\?page=ChatMessageBot* 0; default 1; }

In diesem Fall mappe ich die $request_uri auf die Variable $loggable. Wenn demnach meine oben genannte Anfrage an den Server gesendet wird, erhält die Variable $loggableden Wert 0, ansonsten den Wert 1. Hier kann man natürlich auch mehrere Anfragen untereinander schreiben und ihnen jeweils den Wert 0 zuweisen, sodass sie später nicht beachtet werden.
Das ~ am Anfang der Zeile 2 bedeutet, dass ein regulärer Ausdruck folgt. Das ist hier notwendig, um eine dynamische Anfrage auch zu treffen.

In der server-Direktive muss nun bei der Angabe des access_log eine Erweiterung der Zeile gemacht werden, um die Variable $loggable abzufragen:
access_log /var/log/nginx/access.log combined if=$loggable;
Diese Erweiterung um if=$loggable gibt an, dass nur dann etwas im Log gespeichert wird, wenn $loggable den Wert true zurückgibt, wobei der Wert 0 als false gilt und der Wert 1als true.

Danach muss man nur noch die Konfiguration in nginx neu laden, je nach System beispielsweise mit sudo service nginx reload und schon sollten entsprechende Anfragen nicht mehr in den Logs auftauchen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.