Я испытываю затруднения, заставляя следующее 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?
Я следовал методам включая этого, но не могу получить их работа.
Не видя, как вы пытались использовать шаблоны, которые не работали, я не могу объяснить, почему они не работали.Поскольку вы указали, что предоставленный вами шаблон соответствует серверу, я немного изменил ваше утверждение и добавил немного в конец, чтобы уловить остальное:
(?<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 вокруг вашего фильтра или части ваш фильтр, как в этом ответе . Вы можете сделать то же самое с помощью тегов, если сможете найти способ их пометить. Эти два варианта, вероятно, являются «лучшими» с точки зрения вычислительной мощности, используемой для каждой строки, поскольку я считаю, что потребуется меньше работы, чем что-то вроде этого ответа , поскольку каждое событие нужно будет проверять по каждому шаблону. Вы также можете написать очень сложный шаблон, который мог бы соответствовать любой ситуации, но я не думаю, что это идеальный вариант, поскольку шаблон расширится и будет иметь так много разных потенциальных совпадений, что каждый раз потребуется много энергии для проверки.
Надеюсь, это поможет!
Этот рецепт 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}
Я использовал ответ @ 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""
]
]
}
Шаблон ошибки 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}")?