Logsta sh regex для соответствия всем сообщениям, у которых нет определенного количества разделителей - PullRequest
0 голосов
/ 05 мая 2020

Это кажется довольно простой проблемой, но на данный момент я думаю, что мне просто нужна вторая пара глаз. У меня есть сообщения журнала filebeat, поступающие в конвейер logsta sh. Эти сообщения будут иметь несколько строк, если вы включите трассировку стека исключений. Ниже приведены несколько примеров.

code

BL: | LL: ERROR | TS: random value | MSG: Payment Type  2 |  :EL


BL: | LL: ERROR | TS: 2020-05-03 09:06:29,932 | AR: 38.0.0.51 | LOC: 00742 | USER: 
DASHBOARD_REFRESH | HOST: 0.0.0.0 | DC:  null | MSGID: 1231456478912314869156: |SC: 
some.java.class | MSG: SOME useful ERROR Message  |  
Exception in thread "main" java.lang.NullPointerException: Fictitious NullPointerException
at StackTraceExample.method111(StackTraceExample.java:15)
at StackTraceExample.method11(StackTraceExample.java:11)
at StackTraceExample.method1(StackTraceExample.java:7)
at StackTraceExample.main(StackTraceExample.java:3)
:EL

code

Я хочу сопоставить первое сообщение, указав, что у него нет ровно 11 каналов для добавления тега «Ошибка разделителя» и позволить второму сообщению продолжить работу в моем конвейере. Выражение в его нынешнем виде фактически превращает logsta sh в процесс cra sh.

code

filter {
if [message] =~ /^(\|{0,10}|\|{12,})$/{
    mutate {
            add_tag => [ "Delimiter Error" ] 
        }   
    }
}

code

1 Ответ

2 голосов
/ 05 мая 2020

Текущий шаблон ^(\|{0,10}|\|{12,})$ соответствует либо 0-10, либо более чем 12 каналам в строке и не будет соответствовать никакому другому символу.

Если вы хотите сопоставить строку, которая содержит канал, но не 11 каналов:

^(?!(?:[^|\r\n]*\|){11}[^|\r\n]*$)[^\r\n|]*\|.*$
  • ^ Начало строки
  • (?! Отрицательный просмотр вперед
    • (?:[^|\r\n]*\|){11}[^|\r\n]*$ Сопоставьте 11 каналов и подтвердите конец строки
  • ) Закрыть просмотр вперед
  • [^\r\n|]* Сопоставить любой символ, кроме символа новой строки или вертикальной черты
  • \|.* Сопоставить вертикальную черту и сопоставить 0+ раз перевод строки
  • $ Конец строки

Демо Regex

...