Senden Sie NGINX-Protokolle an Graylog

7

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!

Emilweth
quelle
/var/log/graylog/server/currententhä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_timedie sich eine Zeichenfolge befindet.
Dannosaurier

Antworten:

2

Ich schlage vor, Sie sammeln einige Debug-Informationen: Wie Sie sagten, funktioniert Ihr Netzwerk


  1. TCP-Dump-Pakete auf dem Graylog-Host:

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


TCP-Dump

  1. 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


Graylog-Eingabe

  1. Wenn Sie all dies haben, finden Sie eine RAW-Nachricht von Nginx in Ihrem Graylog:

<190> 26. Juli 16: 12: 07.graylog.nginx :. {. "Zeitstempel" :. "2018-07-26T16: 12: 07 + 03: 00" ,. "Remote_addr" :. "Xx.xxxxx" ,. "body_bytes_sent" :. 4277 ,. "request_time" :. 0.005 ,. "response_status" :. 200 ,. "request" :. "POST./api/cluster/metrics/multiple.HTTP/1.1". " request_method ":." POST ",." host ":." xx.xxxxx ",." upstream_cache_status ":." - "," upstream_addr ":." xx.xxxxx ",." http_x_forwarded_for ":." xx .xxxxx ",." http_referrer ":." https: //xx.xxxxx/system/inputs ",." http_user_agent ":." xx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxx " /1.1",."nginx_access":.true.}


  1. Extrahieren Sie eine Pseudo-Syslog-RAW-Nachricht aus einem JSON mit Graylog Input Extractor:

Extraktor Beispiel:

{
  "extractors": [
    {
      "title": "Extract from Pseudo-Syslog a JSON",
      "extractor_type": "regex_replace",
      "converters": [],
      "order": 0,
      "cursor_strategy": "cut",
      "source_field": "message",
      "target_field": "message",
      "extractor_config": {
        "replacement": "$1",
        "regex": "^.*?(\\{.*?\\})$"
      },
      "condition_type": "none",
      "condition_value": ""
    }
  ],
  "version": "2.4.6"
}

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.


  1. Überprüfen Sie Ihre Nginx-Konfiguration

Beispiel für ngnix.conf:

log_format graylog_json '{ "timestamp": "$time_iso8601", "remote_addr": "$remote_addr", "body_bytes_sent": $body_bytes_sent, "request_time": $request_time, "response_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": "$h    ttp_user_agent", "http_version": "$server_protocol", "nginx_access": true }';
access_log syslog:server=graylog:5555 graylog_json;

Ich hoffe, wenn Sie all diese Schritte befolgen, werden Sie nützlich sein

kgimpel
quelle