Мне не удается получить следующее сообщение журнала ошибок nginx для анализа в отладчик Grok. У меня есть чувство, что я должен использовать глупый трюк, но не могу понять, что это может быть.
2015/03/20 23:35:52 [ошибка] 8 # 0: * 10241823 проверка существования "/ www" не удалась (2: нет такого файла или каталога) при регистрации запроса, клиент: 201.45.203.78, сервер: $ домен, запрос: "GET / ritikapuri_"
Вот мой паттерн Грока:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage} client: %{IP:client}
Этот шаблон приводит меня в раздел «сервер», но я не могу заставить остальное проанализировать, и мне непонятно почему.
Если я использую другой шаблон% {GREEDYDATA} для захвата конца журнала, он иногда не будет анализировать журналы, которые не соответствуют вышеуказанному, и выдает мне _grokparsefailure.
Было бы лучше всего использовать операторы if для перехвата различных вариантов сообщений журнала в nginx?
Я следовал методам, включая вот этот но не могу заставить их работать.
Я использовал ответ @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""
]
]
}
Этот рецепт грока тоже работает, независимо от стоимости 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}
Не видя, как вы пытались использовать шаблоны, которые не работали, я не могу комментировать, почему они не работали. Поскольку вы указали, что предоставленный вами шаблон соответствует серверу, я немного изменил ваше утверждение и добавил немного в конец, чтобы захватить остальное:
(?<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 хорошо взаимодействовал с шаблоном (то есть менять каждый экземпляр " "к" \ ")
ре. : Было бы лучше всего использовать операторы if для перехвата различных вариантов сообщений журнала в nginx?
Я не совсем понимаю, о чем вы спрашиваете, но вы можете поместить операторы if вокруг вашего фильтра или части вашего фильтра, как в этом ответ. Вы можете сделать то же самое с помощью тегов, если сможете найти способ их пометить. Эти два варианта, вероятно, являются «лучшими» с точки зрения вычислительной мощности, используемой для каждой линии, поскольку я считаю, что потребуется меньше работы, чем что-то вроде этого ответ поскольку каждое событие необходимо будет проверять по каждому шаблону. Вы также можете написать очень сложный шаблон, который мог бы соответствовать любой ситуации, но я не думаю, что это идеальный вариант, так как шаблон расширится, чтобы иметь так много разных потенциальных совпадений, что каждый раз потребуется много энергии для проверки.
Надеюсь, это поможет!
Шаблон ошибки 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}")?