Enviar logs do NGINX para o Graylog

3

Estou tentando coletar o erro nginx e acessar logs com o graylog, acho que tudo está configurado corretamente, mas o Graylog não recebe nada do NGINX (Graylog e NGINX estão em contêineres docker e ambos estão na mesma rede)

Eu uso o nginx / 1.13.5 & Graylog 2.4.0 e eu uso este pacote de conteúdo no graylog

Aqui está o meu 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;

Se eu tentar com nc, meu graylog receberá a mensagem

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

Obrigado!

    
por Mickael C 03.04.2018 / 13:48

1 resposta

0

Sugiro que você colete algumas informações de depuração: Como você disse, seu trabalho na rede

  1. Pacotes TCP Dump no host do Graylog:

se o Nginx estiver no mesmo host que o Graylog: sudo tcpdump udp -n -vv port 12301 -i lo -X

se o Nginx estiver em um host diferente como Graylog: sudo tcpdump udp -n -vv port 12301 -X

  • Se o nível da rede funcionar e você puder ver pacotes como na imagem, vá para Graylog Inputs e verifique que tipo de entrada você tem

    [a] Precisa ser UDP de texto simples / simples (se você tiver GELF UDP o Graylog filtrará suas mensagens como o Nginx enviará logs no formato Syslog e não em Json

    [b] Você terá Network IO diferente de 0

    [c] Porta (12301 no seu caso) e IP precisam ser os mesmos da configuração Nginx

  • Se você tiver tudo isso, você encontrará uma mensagem RAW do Nginx no seu Graylog:
  • <190>Jul.26.16:12:07.graylog.nginx:.{."timestamp":."2018-07-26T16:12:07+03:00",."remote_addr":."xx.x.x.xxx",."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.x.x.xxx",."upstream_cache_status":."-",."upstream_addr":."xx.x.x.xxx",."http_x_forwarded_for":."xx.x.x.xxx",."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. Extrair mensagem pseudo-Syslog RAW do formulário um JSON usando Extrator de entrada do Graylog:

    Exemplo de extrator:

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

    À medida que você usa o "pacote de conteúdo", é necessário adicionar a regra antes de todas as outras que acessarem "pacote de conteúdo" (ordem: 0) se você importar exportação

    Depois de adicionar a regra, você terá um log JSON claro do Nginx, todos os outros trabalhos farão "pacote de conteúdo"

    1. Verifique sua configuração do Nginx

    Exemplo do 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;
    

    Espero que, seguindo todos esses passos, você ache útil

        
    por 26.07.2018 / 16:44