logstash / grok 自定义字段
Posted
技术标签:
【中文标题】logstash / grok 自定义字段【英文标题】:logstash / grok custom fileds 【发布时间】:2017-07-18 10:37:32 【问题描述】:我是 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,1496145487308IP,111.11.111.11JTX,1511059/176275501OBJT,goodsMovement.reportsUtils.ConsignmentStocksListOPT,SQPID,111111SS,SSCPLTMPRODPLTRT,SAP_LOGISTIC_REPORTUID,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”,我不知道如何配置这个特定的自定义模式。 我尝试使用 https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns 的模式,但它对我不起作用
【问题讨论】:
【参考方案1】:你的 grok 的开头很好。而不是最后一部分%GREEDYDATA:message_TEST
,它只会将您的消息的其余部分保存到message_TEST
,您应该实际执行对象的解析。这样的事情会将对象中的PID
、IP
和UID
字段保存到各自的变量中(请记住,此模式依赖于字段顺序):
.*IP,%IPV4:IP(.*)3PID,%POSINT:PID(.*)2UID,%DATA:UID
现在稍微解释一下它的作用。外面的一对大括号是你的对象的限制。然后我们将处理对象内部由一对大括号限制的每个字段。
首先:打开大括号
;
那么,第一个内部字段是 CT,1496145487308
,我们对保存它不感兴趣 - 所以告诉 grok 有一些字符串被大括号限制:.*
;
下一个字段是 IP,我们需要保存:IP,111.11.111.11
。它以大括号和IP,
开头,后跟我们必须保存的 IP 地址(匹配中的最后一个 IP 是存储 IP 地址的变量的名称):IP,%IPV4:IP
现在我们有三组不需要保存的大括号括起来的字符串:JTX,1511059/176275501OBJT,goodsMovement.reportsUtils.ConsignmentStocksListOPT,SQ
。对于 grok,它看起来像:(.*)3
;
然后进入 PID 字段:PID,111111
。因为 grok PID 只是一个正整数,类似于用大括号括起来的 IP,前面有 PID,
:PID,%POSINT:PID
;
还有两个我们不想保存的组。与之前的类似跳过它们:(.*)2
;
最后一个字段是:UID,StudentSaSo-8
,这只是 grok 的一串数据。类似于 IP 和 PID 将其保存在各自的变量中:UID,%DATA:UID
;
最后我们得到了右大括号:
。
最后,你最终的 grok 将如下所示:
(?<timestamp>%YEAR-%MONTHNUM-%MONTHDAY %HOUR:%MINUTE:%SECOND,%NONNEGINT)\] %LOGLEVEL:loglevel * \[(?<logger>[A-Za-z0-9$_.]+)\] \(%JAVAFILE:class:%NONNEGINT:line\) \[%NOTSPACE:thread\] %DATAIP,%IPV4:IP(.*)3PID,%POSINT:PID(.*)2UID,%DATA:UID
【讨论】:
感谢 alexK 的回复,但在您的发言之后,我的日志又出现了问题。他们不规律。有些行只有 IP 和 PID 或 JTX、PID 和 UID,而且它们混合在一起,我的意思是 IP、UID 等字段并不总是在同一个位置...:/ 我映射了整个日志,就像你写 CT, %DATA:ctIP,%IPV4:IPJTX,%NONNEGINT:jtxOBJT,%GREEDYDATA:objtOPT%GREEDYDATA:OPTPID,% POSINT:PIDSS,%GREEDYDATA:SSTRT,%GREEDYDATA:TRTUID,%DATA:UID%GREEDYDATA:log_message 有什么办法吗通过自动搜索给定字段或类似的东西?以上是关于logstash / grok 自定义字段的主要内容,如果未能解决你的问题,请参考以下文章