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.

Max
quelle
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;
    }
}
Max
quelle
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
5

access_log unterstützt wenn:

(access_log path [format [buffer = size [flush = time]] [if = condition]];)

access_log /var/.... if $crawler;

Quelle:

http://nginx.org/en/docs/http/ngx_http_log_module.html

Thomas Decaux
quelle
Dies ist die sauberere Lösung ab NGINX 1.7.0.
Oliver
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 ;
}
cjc
quelle
access_logInsider- ifAussage an sich ist nicht möglich, siehe meine Antwort unten.
Max