首页 > 解决方案 > 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 个管道来匹配第一条消息来添加标签“分隔符错误”并允许第二条消息继续通过我的管道。该表达式实际上使 logstash 进程崩溃。

code

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

code

标签: regexlogstash

解决方案


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

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

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

正则表达式演示


推荐阅读