我是ELK堆栈的全新用户。从我的日志中过滤掉特定部分我遇到了一些问题。
示例日志:
[2017-05-30 13:58:09,336] INFO [com.qwerty.test.core.services.impl.order.OrderEntryService] (OrderEntryService.java:5426) [http-/0.0.0.0:1111-111] {{CT,1496145487308}{IP,111.11.111.11}{JTX,1511059/176275501}{OBJT,goodsMovement.reportsUtils.ConsignmentStocksList}{OPT,SQ}{PID,111111}{SS,SSCPLTMPRODPL}{TRT,SAP_LOGISTIC_REPORT}{UID,StudentSaSo-8}}: Saving order: K1010101
和我的grok过滤器:
grok {
match => { "message" => "(?<timestamp>%{YEAR}-%{MONTHNUM2}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND},%{NONNEGINT})\] %{LOGLEVEL:loglevel} * \[(?<logger>[A-Za-z0-9$_.]+)\] \(%{JAVAFILE:class}:%{NONNEGINT:line}\) \[%{NOTSPACE:thread}\] %{GREEDYDATA:message_TEST}"}
}
所以我需要过滤掉“ID”,“PID”,IP和“UID”,我不知道如何配置这个特定的自定义模式。 我尝试使用workspace.RData中的模式,但它对我不起作用
答案 0 :(得分:0)
你的grok的开头很好。而不是将消息的剩余部分保存到%{GREEDYDATA:message_TEST}
的最后一部分message_TEST
,您应该实际执行对象的解析。这样的内容会将对象中的PID
,IP
和UID
字段保存到相应的变量中(请记住,此模式依赖于字段顺序):
{{.*}{IP,%{IPV4:IP}}({.*}){3}{PID,%{POSINT:PID}}({.*}){2}{UID,%{DATA:UID}}}
现在对它的作用做一点解释。外部大括号是对象的限制。然后我们将处理由对象内部的一对花括号限制的每个字段。
{
; {CT,1496145487308}
,我们对保存它不感兴趣 - 所以告诉grok,有些字符串受大括号限制:{.*}
; {IP,111.11.111.11}
。它以大括号和IP,
开头,后跟我们必须保存的IP地址(匹配中的最后一个IP是将存储IP地址的变量的名称):{IP,%{IPV4:IP}
{JTX,1511059/176275501}{OBJT,goodsMovement.reportsUtils.ConsignmentStocksList}{OPT,SQ}
。对于grok,它看起来像:({.*}){3}
; {PID,111111}
。对于grok,PID只是一个正整数,类似于IP用大括号括起来,前面有PID,
:{PID,%{POSINT:PID}}
; ({.*}){2}
; {UID,StudentSaSo-8}
,它只是grok的一串数据。与IP和PID类似,将其保存在相应的变量中:{UID,%{DATA:UID}}
; }
。最后,你的最终格言将如下所示:
(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND},%{NONNEGINT})\] %{LOGLEVEL:loglevel} * \[(?<logger>[A-Za-z0-9$_.]+)\] \(%{JAVAFILE:class}:%{NONNEGINT:line}\) \[%{NOTSPACE:thread}\] {%{DATA}{IP,%{IPV4:IP}}({.*}){3}{PID,%{POSINT:PID}}({.*}){2}{UID,%{DATA:UID}}}