Шаблон 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/ попробовать. Это лучший способ отладки рисунков грока, которые не приводят к выпадению волос.