Logstash 正则表达式匹配所有没有一定数量分隔符的消息

Logstash regex to match all messages that dont have a certain number of delimiters

这似乎是一个非常简单的问题,但在这一点上我想我只需要第二双眼睛。我有 filebeat 日志消息进入 logstash 管道。当您包含异常的堆栈跟踪时,这些消息将有多行。下面是几个例子。

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 个管道来添加标签 "Delimiter Error" 并允许第二条消息继续通过我的管道。该表达式实际上会使 logstash 进程崩溃。

code

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

code

当前模式^(\|{0,10}|\|{12,})$匹配连续的0-10个或超过12个管道,并且不会匹配任何其他字符。

如果要匹配包含一个管道但不包含 11 个管道的字符串:

^(?!(?:[^|\r\n]*\|){11}[^|\r\n]*$)[^\r\n|]*\|.*$
  • ^ 字符串开头
  • (?! 否定前瞻
    • (?:[^|\r\n]*\|){11}[^|\r\n]*$ 匹配 11 个管道并断言字符串结束
  • ) 关闭前瞻
  • [^\r\n|]* 匹配除换行符或竖线以外的任何字符
  • \|.*匹配一个管道,匹配0+次换行
  • $ 字符串结束

Regex demo