журнал ошибок nginx шаблон Grok

Я испытываю затруднения, заставляя следующее nginx сообщение журнала ошибок проанализировать в grok отладчике. У меня есть чувство, что существует глупый прием, что я должен использовать, но не могу выяснить, каково это может быть.

20.03.2015 23:35:52 [ошибка] 8#0: *10 241 823 тестирования "/www" существование перестали работать (2: Никакой такой файл или каталог) при входе запроса, клиента: 201.45.203.78, сервер: $domain, запрос: "ПОЛУЧИТЕ/ritikapuri _"

Вот мой шаблон Grok до сих пор:

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

Этот шаблон получает меня к разделу "сервера", но я, может казаться, не заставляю остальных анализировать, и это не ясно мне почему.

Если я использую другой % {GREEDYDATA} шаблон для захвата конца журнала это иногда, привычка' анализирует журналы, которые не соответствуют вышеупомянутому и дают мне _grokparsefailure.

Оптимальный маршрут состоял бы в том, чтобы использовать, если операторы для захвата различных изменений журнала обмениваются сообщениями в nginx?

Я следовал методам включая этого, но не могу получить их работа.

6
задан 23 November 2018 в 12:17
4 ответа

Не видя, как вы пытались использовать шаблоны, которые не работали, я не могу объяснить, почему они не работали.Поскольку вы указали, что предоставленный вами шаблон соответствует серверу, я немного изменил ваше утверждение и добавил немного в конец, чтобы уловить остальное:

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

Обратите внимание, что после вашего GREEDYDATA я добавил запятую, как вы, вероятно, не делаете ' Я не хочу, чтобы это было в ваших захваченных данных, и я предполагаю, что это всегда будет использоваться перед клиентской частью сообщения. Я подозреваю, что у вас возникла проблема с сопоставлением $ domain, так как вам нужен \ перед $, чтобы избежать его.

Обратите внимание, хотя это работает в отладчике Grok, я подозреваю, что этого не будет в logstash, вам необходимо также избегайте всех ваших пробелов, чтобы logstash хорошо взаимодействовал с шаблоном (то есть, измените каждый экземпляр "" на "\")

re. : Было бы лучше всего использовать операторы if для перехвата различных вариантов сообщений журнала в nginx?

Я не совсем понимаю, о чем вы спрашиваете, но вы можете поместить операторы if вокруг вашего фильтра или части ваш фильтр, как в этом ответе . Вы можете сделать то же самое с помощью тегов, если сможете найти способ их пометить. Эти два варианта, вероятно, являются «лучшими» с точки зрения вычислительной мощности, используемой для каждой строки, поскольку я считаю, что потребуется меньше работы, чем что-то вроде этого ответа , поскольку каждое событие нужно будет проверять по каждому шаблону. Вы также можете написать очень сложный шаблон, который мог бы соответствовать любой ситуации, но я не думаю, что это идеальный вариант, поскольку шаблон расширится и будет иметь так много разных потенциальных совпадений, что каждый раз потребуется много энергии для проверки.

Надеюсь, это поможет!

2
ответ дан 3 December 2019 в 00:28

Этот рецепт Grok также работает, независимо от значения поля 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}
2
ответ дан 3 December 2019 в 00:28

Я использовал ответ @ dr01, чтобы улучшить рецепт журналов ошибок в nginx 1.15 с использованием формата уведомления - этот ответ будет разделять версию HTTP и метод HTTP и запрос.

(?<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}

образец строки

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"

Вывод от отладчика 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""
    ]
  ]
}
2
ответ дан 3 December 2019 в 00:28

Шаблон ошибки Grok с добавлением необязательного восходящего потока и поля реферер . Протестировано с nginx: 1.17.3

(?<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}))"(, upstream: "%{GREEDYDATA:upstream}")?, host: "%{DATA:host}"(, referrer: "%{GREEDYDATA:referrer}")?
0
ответ дан 18 February 2020 в 13:45

Теги

Похожие вопросы