Назад | Перейти на главную страницу

Отправить журналы NGINX в Graylog

Я пытаюсь собрать журнал ошибок nginx и получить доступ к журналам с Graylog, я думаю, что все настроено правильно, но Graylog ничего не получает от NGINX (Graylog и NGINX находятся в контейнерах докеров, и оба находятся в одной сети)

Я использую nginx / 1.13.5 и Graylog 2.4.0 и использую этот пакет контента на Graylog

Вот мой 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

Спасибо!

Я предлагаю вам собрать некоторую отладочную информацию: как вы сказали, ваша сеть работает


  1. Пакеты TCP Dump на хосте Graylog:

если Nginx находится на том же хосте, что и Graylog: sudo tcpdump udp -n -vv port 12301 -i lo -X

если Nginx находится на другом хосте как Graylog: sudo tcpdump udp -n -vv port 12301 -X


  1. Если сетевой уровень работает и вы видите пакеты, как на картинке, перейдите в Graylog Inputs и проверьте, какой тип ввода у вас есть.

    [a] Это должно быть Raw / Plaintext UDP (если у вас GELF UDP Graylog будет фильтровать ваши сообщения так как Nginx отправляет логи в формате Syslog, а не в Json

    [b] У вас будет Сетевой ввод-вывод отличается от 0

    [c] Порт (12301 в вашем случае) и IP должно быть таким же, как в конфигурации Nginx


  1. Если у вас есть все это, вы найдете в своем Graylog сообщение RAW от Nginx:

<190> 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.x.x.xxx/system/inputs",." http_user_agent ":." xx.x.x.xxxxx.x.x.xxxxx.x.x.xxxxx.x.x.xxx ",." http_version ":." HTTP / 1.1 ",." nginx_access ":. true.}


  1. Извлеките из RAW сообщения псевдо-системного журнала в формате JSON, используя Graylog Input Extractor:

Пример экстрактора:

{
  "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), если вы выполняете импорт и экспорт.

После добавления правила у вас будет чистый журнал JSON от Nginx, все остальное будет делать «пакет контента»


  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;

Надеюсь, следуя всем этим шагам, вы найдете полезными