erro nginx log padrão Grok

5

Estou tendo problemas para obter a seguinte mensagem de log de erro nginx para analisar o depurador grok . Eu tenho a sensação de que há um truque estúpido que eu deveria usar, mas não consigo descobrir o que pode ser.

2015/03/20 23:35:52 [error] 8#0: *10241823 testing "/www" existence failed (2: No such file or directory) while logging request, client: 201.45.203.78, server: $domain, request: "GET /ritikapuri_"

Aqui está o meu padrão Grok até agora:

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage} client: %{IP:client}

Esse padrão me leva à seção "servidor", mas parece que não consigo analisar o resto e não está claro para mim o motivo.

Se eu usar outro padrão% {GREEDYDATA} para pegar o final do log, às vezes ele não analisará os logs que não corresponderem aos acima e me fornecerá uma falha _grokparse.

A melhor rota seria usar se instruções para interceptar as diferentes variações de mensagens de log no nginx?

Eu segui métodos que incluem este , mas não consigo fazê-los funcionar.

    
por jmreicha 21.03.2015 / 04:25

3 respostas

3

Esta receita grok também funciona, não importa o valor do campo server :

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:errormessage}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: %{GREEDYDATA:request}
    
por 10.05.2017 / 15:11
2

Sem ver você tentando padrões que não funcionaram, não posso comentar por que eles não funcionaram. Como você afirmou que o padrão que você forneceu corresponde ao servidor, eu modifiquei sua declaração um pouco e adicionei um pouco ao final para capturar o restante:

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage},\ client: %{IP:client}, server: \$domain, request: \"%{WORD:method} %{URIPATH:path}\"

Observe que, após o seu GREEDYDATA, eu adicionei uma vírgula, como você provavelmente não deseja que em seus dados capturados, e suponho que sempre será usado antes da parte do cliente da mensagem. Eu suspeito que você teve problemas com $ domain, já que você precisa de um \ na frente do $ para escapar dele.

Por favor, note que enquanto isso funciona no debugger grok, eu suspeito que ele não irá no logstash, você precisará escapar de todos os seus espaços também, para que o logstash seja legal com o padrão (isto é, mudar cada instância "" para "\")

re. : A melhor rota seria usar se instruções para interceptar as diferentes variações de mensagens de log no nginx?

Não estou bem claro sobre o que você está perguntando, mas você pode colocar instruções if em torno do seu filtro, ou partes do filtro, como neste answer . Você pode fazer a mesma coisa usando tags, se conseguir descobrir uma maneira de marcá-las. Estas duas opções são provavelmente "melhores" em termos de poder de processamento usado para cada linha, pois acredito que haverá menos trabalho envolvido do que algo como isto answer , pois cada evento precisaria ser verificado em relação a cada padrão. Você também pode escrever um padrão muito complexo que poderia corresponder a todas as situações diferentes, mas eu não acho que isso seja ideal, já que o padrão se expandirá para ter tantas combinações potenciais diferentes que precisaria de muito poder para checar a cada vez.

Espero que ajude!

    
por 29.04.2015 / 17:40
1

Eu usei a resposta do @dr01 para melhorar a receita dos registros de erros em nginx 1.15 usando o formato de aviso prévio - essa resposta separará a versão HTTP, o método HTTP e a solicitação.

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:message}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion}))", host: %{GREEDYDATA:host}

string de amostra

2015/03/20 23:35:52 [error] 8#0: *10241823 testing "/www" existence failed (2: No such file or directory) while logging request, client: 201.45.203.78, server: $domain, request: "GET /dsfadsfe HTTP/1.1", host: "localhost:8080"

Saída do depurador grok

{
  "timestamp": [
    [
      "2015/03/20 23:35:52"
    ]
  ],
  "severity": [
    [
      "error"
    ]
  ],
  "pid": [
    [
      "8"
    ]
  ],
  "threadid": [
    [
      "0"
    ]
  ],
  "connectionid": [
    [
      "10241823"
    ]
  ],
  "message": [
    [
      "testing "/www" existence failed (2: No such file or directory) while logging request"
    ]
  ],
  "client": [
    [
      "201.45.203.78"
    ]
  ],
  "server": [
    [
      "$domain"
    ]
  ],
  "verb": [
    [
      "GET"
    ]
  ],
  "request": [
    [
      "/dsfadsfe"
    ]
  ],
  "httpversion": [
    [
      "1.1"
    ]
  ],
  "host": [
    [
      ""localhost:8080""
    ]
  ]
}
    
por 22.11.2018 / 22:30