用于Logstash的Grok过滤器以匹配日志文件中的特定值

时间:2018-10-30 13:19:10

标签: elasticsearch logstash logstash-grok

我有以下日志:

2018-10-30 11:47:52 INFO     30464 SMS-MT [cid:300038] [queue-msgid:bb7a195d-fb23-42ae-bbfa-d2dcda405af9] [smpp-msgid:j.11082.639364178944.#MARKET SETU] [status:ESME_ROK] [prio:1] [dlr:NO_SMSC_DELIVERY_RECEIPT_REQUESTED] [validity:none] [from:2323232] [to:23232132312] [content:'#MARKET SETUP\nadsadadadadasdasdadaasdada mo ang:\nC jean_rivera\n--Mag reply ng A-C']

我已经基于logstash中的模式创建了grok过滤器,因此我可以按自己的方式解析日志。我有这个:

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}     %{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} %{CID:CID} %{GREEDYDATA:Message}

我正在尝试创建一个与 300038 相匹配的GROK模式,它是cid:之后的数字。语法始终相同,[cid:number]。我现在拥有的是:

    CID (\[cid:[0-9]{6}\])
but that results into: 
"CID": [
    [
      "[cid:300038]"
    ]
  ],

,我只想匹配300038,而没有 [cid:]部分

2 个答案:

答案 0 :(得分:1)

使用

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}     %{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} \[cid:(?<CID>[0-9]{6})\] %{GREEDYDATA:Message}

答案 1 :(得分:1)

我注意到LOGpid之间有多个空格字符,您可以使用\s*来匹配所有字符。

要仅匹配[cid:300038]中的数字,可以使用custom pattern\[cid:(?<CID>[0-9]{1,})\]可以匹配任意长度的cid,而不仅仅是6位数字。

您的模式将变成

%{DATESTAMP:Timestamp} %{LOGLEVEL:Level}\s*%{BASE10NUM:Pid} %{USERNAME:SMS_TYPE} \[cid:(?<CID>[0-9]{1,})\] %{GREEDYDATA:Message}