web-dev-qa-db-ja.com

NGINXログをGraylogに送信する

私はnginxエラーを収集し、graylogでログにアクセスしようとしています、すべてが正しく構成されていると思いますが、GraylogはNGINXから何も受信しません(GraylogとNGINXはDockerコンテナーにあり、両方が同じネットワークにあります)

私はnginx/1.13.5とGraylog 2.4.0を使用していますが、グレイログで このコンテンツパック を使用しています

これが私の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;

Ncを使用すると、私のグレーログにメッセージが表示されます

echo -n "test message" | nc -u -w1 graylog 12301

ありがとう!

7
Mickael C

いくつかのデバッグ情報を収集することをお勧めします。


  1. Graylogホスト上のTCPダンプパケット:

nginxがGraylogと同じホスト上にある場合:Sudo tcpdump udp -n -vv port 12301 -i lo -X

別のホスト上のNginxがGraylogの場合:Sudo tcpdump udp -n -vv port 12301 -X


tcp dump

  1. ネットワークレベルが機能し、画像のようなパケットが表示される場合は、Graylog入力に移動して、どの種類の入力があるかを確認します

    [a]Raw/Plaintext UDPである必要があります(GELF UDPがある場合GraylogはメッセージをフィルタリングしますasNginxはJsonではなくSyslog形式でログを送信します

    [b]Network IO 0とは異なる

    [c]Port(あなたの場合12301)と[〜#〜] ip [〜#〜]はNginx構成と同じである必要があります


graylog input

  1. あなたがこれをすべて持っているなら、あなたはあなたのGraylogにNginxからのRAWメッセージを見つけるでしょう:

<190> Jul.26.16:12:07.graylog.nginx:。{。 "timestamp":。 "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.xxxxx "、。" http_version ":。" HTTP/1.1 "、。" nginx_access ":。true。}


  1. Graylog入力抽出機能を使用して、疑似Syslog RAWメッセージをJSON形式で抽出します。

抽出器の例:

{
  "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"
}

「コンテンツパック」を使用する場合、インポートエクスポートを実行する場合は、「コンテンツパック」(順序:0)からの他のすべてのルールの前にルールを追加する必要があります。

ルールを追加すると、NginxからのJSONログがクリアされ、他のすべての作業は「コンテンツパック」を実行します


  1. Nginx設定を確認する

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;

このすべての手順を実行すると、役立つと思います

1
kgimpel