Separate Nginx-Zugriffsprotokolldatei nur für bestimmte Anforderungen


7

Soweit ich sehen kann, unterstützt Nginx standardmäßig 2 Protokolldateien: error_log(verfolgt Probleme im Zusammenhang mit dem Nginx-Server selbst) und access_log(verfolgt von Nginx verarbeitete Anforderungen). Obwohl es möglich ist, das Format access_logmit der log_formatRichtlinie zu steuern , ist es mir nicht gelungen, eine Möglichkeit zu finden, nur bestimmte Anforderungen in einer separaten Datei zu protokollieren, und ich möchte daher die Frage zu SF als Referenz für zukünftige Leser stellen:

Gibt es eine Möglichkeit, bestimmte Anforderungen in einer anderen als der von definierten Protokolldatei zu protokollieren access_log?

Zu Ihrer Information, der Grund für diese Frage ist, dass ich eine Regel habe, die den Zugriff auf unerwünschte Crawler mit einer 200 verweigert (weil 403 ihnen einen Hinweis geben würde, dass sie blockiert werden), und das Herausfiltern dieser Anforderungen aus der access_logwird schwieriger.


nginx 1.7.0+ ermöglicht die Verwendung einer if-Bedingung in der access_log-Direktive selbst. Überprüfen Sie stackoverflow.com/a/25852578/2208271
Sithsu

Antworten:


8

cjcBring mich auf den richtigen Weg. Die Verwendung access_login einer ifAnweisung allein ist nicht möglich (Sie erhalten eine nginx: [emerg] "access_log" directive is not allowed hereFehlermeldung). Die Problemumgehung lautet also wie folgt:

if ($http_user_agent ~* (crawler) ) {
  set $crawler 'yes';
}
location ~ .* {
  if ($crawler = 'yes') {
    access_log /var/log/nginx/blockedbots.log;
    return 200;
    }
}

Ist das nicht ein Zugriffsprotokoll in einer if-Anweisung?
Xeoncross

Ja, der Doc sagt, dass Sie verwenden könnenContext: http, server, location, **if in location**, limit_except
Xeoncross


4

Sie sollten in der Lage sein, eine access_logDirektive ifgemäß der Dokumentation in einen Block einzufügen:

http://wiki.nginx.org/HttpLogModule

Sie sollten also in der Lage sein, Folgendes zu tun:

if ($http_user_agent ~* (crawler) ) {
   access_log /path/to/other/log/file ;
}

access_logInsider- ifAussage an sich ist nicht möglich, siehe meine Antwort unten.
Max
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.