Ich versuche, Nginx-Fehler zu erfassen und mit Graylog auf Protokolle zuzugreifen. Ich denke, alles ist korrekt konfiguriert, aber Graylog erhält nichts von NGINX (Graylog und NGINX befinden sich in Docker-Containern und beide befinden sich im selben Netzwerk).
Ich verwende nginx / 1.13.5 & Graylog 2.4.0 und dieses Inhaltspaket für Graylog
Hier ist meine nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": $body_bytes_sent, '
'"request_time": $request_time, '
'"status": $status, '
'"request": "$request", '
'"request_method": "$request_method", '
'"host": "$host",'
'"upstream_cache_status": "$upstream_cache_status",'
'"upstream_addr": "$upstream_addr",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log syslog:server=graylog:12301,facility=local0,tag=nginx,severity=info graylog2_json;
error_log syslog:server=graylog:12302,facility=local0,tag=nginx,severity=error warn;
#error_log stderr;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
daemon off;
Wenn ich es mit nc versuche, erhält mein Graylog die Nachricht
echo -n "test message" | nc -u -w1 graylog 12301
Vielen Dank!
/var/log/graylog/server/current
enthält Debug-Informationen sowie Analysefehlerinformationen (was meiner Meinung nach der Fall ist). Wenn Ihr Graylog-Server JSON erwartet (was bei Verwendung des Nginx-Kollektors der Fall sein wird), ist Ihr JSON meiner Meinung nach ungültig und verursacht Analysefehler. Insbesondere fehlen doppelte Anführungszeichen, um$request_time
die sich eine Zeichenfolge befindet.Antworten:
Ich schlage vor, Sie sammeln einige Debug-Informationen: Wie Sie sagten, funktioniert Ihr Netzwerk
wenn Nginx auf demselben Host wie Graylog:
sudo tcpdump udp -n -vv port 12301 -i lo -X
wenn Nginx auf einem anderen Host als Graylog:
sudo tcpdump udp -n -vv port 12301 -X
Wenn die Netzwerkebene funktioniert und Sie Pakete wie auf dem Bild sehen können, gehen Sie zu Graylog-Eingaben und überprüfen Sie, welche Art von Eingabe Sie haben
[a] Es muss Raw / Plaintext UDP sein (wenn Sie GELF UDP haben, filtert Graylog Ihre Nachrichten, wenn Nginx Protokolle im Syslog-Format und nicht in Json sendet
[b] Sie haben eine andere Netzwerk-E / A als 0
[c] Port (in Ihrem Fall 12301) und IP müssen mit denen in der Nginx-Konfiguration übereinstimmen
Extraktor Beispiel:
Wenn Sie "Content Pack" verwenden, müssen Sie die Regel vor allen anderen hinzufügen, die aus "Content Pack" (Reihenfolge: 0) stammen, wenn Sie den Export importieren
Nachdem Sie die Regel hinzugefügt haben, haben Sie ein klares JSON-Protokoll von Nginx. Alle anderen Arbeiten führen "Content Pack" aus.
Beispiel für ngnix.conf:
Ich hoffe, wenn Sie all diese Schritte befolgen, werden Sie nützlich sein
quelle