Назад | Перейти на главную страницу

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

Мне не удается получить следующее сообщение журнала ошибок 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}")?