Грок проваливается в скобках
Я получаю постоянный провал в скобках. Я избежал скобки со знаком "\". Я также пытался обмануть это с помощью подстановочных знаков. Отладчик Grok анализирует правильно, но не может выполнить анализ в производственной среде. У меня есть две другие записи, которые демонстрируют такое же поведение, в то время как другие шаблоны без скобок разбираются.
'%{WORD: тип}[%{INT:pid}]' является проблемой.
#Jan 15 13:35:44 firewall sshd[1468]: Accepted publickey for john from 192.168.1.16 port 62529 ssh2: .....
AUTHLOG1 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} %{WORD:type}\[%{INT:pid}\]: Accepted publickey for %{USERNAME:user} from %{IP:src_ip} port %{INT:port} %{WORD:protocol}*)
#Jan 15 13:35:44 firewall systemd-logind[1221]: New session 481 of user john.
AUTHLOG4 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} (?<type>[a-z-]+)\[%{INT:pid}\]: Removed session %{INT:session}.)
AUTHLOG (?:%{AUTHLOG1}|%{AUTHLOG2}|%{AUTHLOG3}|%{AUTHLOG4}|%{AUTHLOG5}|%{AUTHLOG6})
if [type] == "authlog" {
grok {
match => { "message" => "%{AUTHLOG}"}
patterns_dir => ["/etc/logstash/grok"]
}
}
2 ответа
Хорошо, я понял это. Это не имело никакого отношения к тому, как я избежал скобок. Я использовал зарезервированное слово "тип" в качестве переменной.
Вы много грызете с этим конфигом.
Сначала попробуйте вытащить материал из системного журнала. Это характерно для каждой строки, поэтому ее легко сопоставлять и выделять из линии, оставляя только более уникальные элементы для анализа другими шаблонами. Другими словами, не делайте "date A|date B|date C", но извлекайте дату, а затем ищите A, B, C. Более короткие строки, работающие с закороченными регулярными выражениями, должны быть лучше.
Затем представьте, как выглядит регулярное выражение, которое вы пытаетесь использовать. Я держусь подальше от "|" за исключением очень маленьких паттернов ("Вкл. / Выкл."). Я не измерял производительность, но предпочитаю, чтобы она была написана:
match => { message => [
"Pattern 1 %{WORD} ...",
"Pattern 2 %{WORD} ..."
]
}
Чтобы начать отвечать на реальный вопрос, в скобках регулярных выражений указываются классы символов, например, "[az]". Чтобы сказать grok, что вы имеете в виду буквальную скобку, вам нужно экранировать только открытую скобку, например "\foo]" (поскольку закрывающая скобка утратила свою магию, не будучи соединенной с открывающим скобкой). Должно быть хорошо, чтобы экранировать оба для удобства чтения, например "\[foo\]".
Ваш пример содержит 6 шаблонов, которые вы применяете к каждой строке ввода. Grokparsefailure только говорит вам, что ни один из них не подходит. Чтобы выяснить, почему, посмотрите на один шаблон, который вы ожидали, чтобы соответствовать. Если ошибка не очевидна, перенесите шаблон и вашу строку ввода в отладчик grok. Отрежьте 2-ую половину шаблона и посмотрите, соответствует ли он. Повторяйте, пока не найдете часть, которая ломается.
В вашем случае простое вставление шаблона в отладчик заставило меня задуматься, почему у вас есть круглые скобки вокруг шаблона, когда ни один не появляется на входе. Уберите их (и звездочку в конце), и я думаю, что это соответствует.