logstash / grok自定义文件

时间:2017-07-18 10:37:33

标签: elasticsearch logging logstash logstash-grok

我是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中的模式,但它对我不起作用

1 个答案:

答案 0 :(得分:0)

你的grok的开头很好。而不是将消息的剩余部分保存到%{GREEDYDATA:message_TEST}的最后一部分message_TEST,您应该实际执行对象的解析。这样的内容会将对象中的PIDIPUID字段保存到相应的变量中(请记住,此模式依赖于字段顺序):

{{.*}{IP,%{IPV4:IP}}({.*}){3}{PID,%{POSINT:PID}}({.*}){2}{UID,%{DATA:UID}}}

现在对它的作用做一点解释。外部大括号是对象的限制。然后我们将处理由对象内部的一对花括号限制的每个字段。

  • first:打开大括号{;
  • 然后,第一个内部字段是{CT,1496145487308},我们对保存它不感兴趣 - 所以告诉grok,有些字符串受大括号限制:{.*};
  • 接下来是使用IP的字段,我们需要保存:{IP,111.11.111.11}。它以大括号和IP,开头,后跟我们必须保存的IP地址(匹配中的最后一个IP是将存储IP地址的变量的名称):{IP,%{IPV4:IP}
  • 现在我们有三组用大括号括起来的字符串,我们不需要保存:{JTX,1511059/176275501}{OBJT,goodsMovement.reportsUtils.ConsignmentStocksList}{OPT,SQ}。对于grok,它看起来像:({.*}){3};
  • 然后进入PID字段:{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}}}