Шаблон Logstash Grok против Python Regex?

Я пытаюсь настроить logstash для управления различными источниками журналов, одним из которых является Mongrel2. Формат, используемый Mongrel2: tnetstring где лог-сообщение примет форму

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

Я хочу написать свои собственные шаблоны Grok для извлечения определенных полей из вышеуказанного формата. Я начал с проверки моего регулярного выражения в приведенном выше сообщении, регулярное выражение

^(?:[^:]*\:){2}([^,]*)

это соответствует localhost, Когда я использую то же регулярное выражение в качестве шаблона Грока в форме

TEST ^(?:[^:]*\:){2}([^,]*)
MONGREL %{TEST:test}

и настройте logstash с

filter {
  grok {
    match => [ "message", "%{MONGREL}" ]
  }
}

тот же результат регулярного выражения в матче 86:9:localhost, Я не могу понять, где я иду не так? Является ли то, что движок регулярных выражений, который я использовал для тестирования, основан на Python, а регулярные выражения фильтра Грока - на Онигураме?

В настоящее время тестируем его в grokdebug со следующим вводом

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#]

и следующий шаблон

(?<hostname>^(?:[^:]*\:){2}([^,]*))

в результате чего

{
  "hostname": [
    [
      "86:9:localhost"
    ]
  ]
}

где я хочу

{
  "hostname": [
    [
      "localhost"
    ]
  ]
}

2 ответа

Решение

Такой шаблон извлечет имя хоста:

^(\d+)?:(\d+)?:(?<hostname>[^,]+),

Или писать так же, как вы уже написали:

^(?:[^:]*\:){2}(?<hostname>[^,]*)

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

Дайте http://grokdebug.herokuapp.com/ попробовать. Это лучший способ отладки рисунков грока, которые не приводят к выпадению волос.

Другие вопросы по тегам