这似乎是一个非常简单的问题,但在这一点上,我认为我只需要第二双眼睛。我有进入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演示