Grok не работает на кронштейнах

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

Проблема заключается в «%{WORD:type}[%{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"]
        }
  }

person Michael Johnson    schedule 15.01.2017    source источник
comment
Пожалуйста, пройдите Tour, прочитайте How To Спросите и создайте MCVE.   -  person Hermann Döppes    schedule 15.01.2017
comment
Я получаю tags:_grokparsefailure в Kibana. Logstash не анализирует его правильно.   -  person Michael Johnson    schedule 16.01.2017


Ответы (2)


Вы много откусываете с этим конфигом.

Во-первых, сначала попробуйте вытащить содержимое системного журнала. Это общее для каждой строки, поэтому его легко сопоставить и извлечь из строки, оставив только более уникальные вещи для анализа другими шаблонами. Другими словами, не делайте «дата A|дата B|дата C», а извлекайте дату, а затем ищите A, B, C. Более короткие строки, работающие с короткими регулярными выражениями, должны быть лучше.

Затем представьте, как выглядит основное регулярное выражение, которое вы пытаетесь использовать. Я держусь подальше от "|" за исключением очень маленьких шаблонов («Вкл. | Выкл.»). Я не измерял производительность, но предпочитаю, чтобы она была написана:

match => { message => [
    "Pattern 1 %{WORD} ...",
    "Pattern 2 %{WORD} ..."
    ]
}

Чтобы начать отвечать на ваш реальный вопрос, скобки в регулярных выражениях используются для отображения классов символов, например. «[а-я]». Чтобы сообщить grok, что вы имеете в виду буквальную скобку, вам нужно экранировать только открывающую скобку, например "\foo]" (поскольку закрывающая скобка потеряла свою магию из-за того, что не была соединена с открывающей скобкой). Должно быть нормально экранировать оба для удобочитаемости, например, "\[foo\]".

Ваш пример содержит 6 шаблонов, которые вы применяете к каждой строке ввода. Grokparsefailure только говорит вам, что ни один из них не совпал. Чтобы понять почему, посмотрите на единственный шаблон, который вы ожидали найти. Если ошибка не очевидна, отнесите шаблон и строку ввода в отладчик grok. Отрежьте вторую половину выкройки и посмотрите, совпадает ли она. Повторяйте, пока не найдете часть, которая ломается.

В вашем случае просто вставка шаблона в отладчик заставила меня задаться вопросом, почему у вас есть круглые скобки вокруг шаблона, когда они не отображаются на входе. Уберите их (и звездочку в конце), и я думаю, что они совпадают.

person Alain Collins    schedule 16.01.2017
comment
Спасибо за совет. Много вещей, чтобы попробовать здесь - person Michael Johnson; 16.01.2017

Хорошо, я понял это. Это не имело никакого отношения к тому, как я избежал скобок. Я использовал зарезервированное слово «тип» в качестве переменной.

person Michael Johnson    schedule 17.01.2017