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



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

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个管道的字符串:

^(?!(?:[^|rn]*|){11}[^|rn]*$)[^rn|]*|.*$
  • ^字符串开始
  • (?!负面展望
    • (?:[^|rn]*|){11}[^|rn]*$匹配11个管道并断言字符串末尾
  • )关闭前瞻
  • [^rn|]*匹配换行符或管道以外的任何字符
  • |.*匹配管道并匹配0+倍换行符
  • $字符串结束

Regex演示

最新更新