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,您应该实际执行对象的解析。这样的事情会将对象中的PIDIPUID 字段保存到各自的变量中(请记住,此模式依赖于字段顺序):

.*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 自定义字段的主要内容,如果未能解决你的问题,请参考以下文章

Logstash grok 模式过滤自定义日志消息

Grok自定义模式

使用 CSS 修复自定义字体行高

C++11 用户自定义字面值

Logstash - grok 使用消息以外的字段

Typecho文章自定义字段的使用方法