评论

收藏

[python] logstash之Grok插件正则表达式使用示例

编程语言 编程语言 发布于:2021-12-31 14:57 | 阅读数:621 | 评论:0

一、文档地址
logstash插件grok地址:​​https://www.elastic.co/guide/en/logstash/7.6/plugins-filters-grok.html​​
正则在线调试:​​http://grokdebug.herokuapp.com/​​
官方预定义的 grok 表达式:​​https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns​​
grok·ELKstack中文指南:​​https://elkguide.elasticsearch.cn/logstash/plugins/filter/grok.html​​

二、Grok表达式语法

1.官方预定义的 grok 表达式
%{grok正则:别名:类型}
%{PATTERN_NAME:capture_name:data_type}
data_type 目前只支持两个值:int 和 float
\s*或者\s+,代表多个空格
\S+或者\S*,代表多个字符
官方预定义的 grok 表达式:​​https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns​​

2.自定义表达式
(?<自定义字段名>正则)

3.多行匹配
在和 codec/multiline 搭配使用的时候,需要注意一个问题,grok 正则和普通正则一样,默认是不支持匹配回车换行的。就像你需要 ​​=~ //m​​​ 一样也需要单独指定,具体写法是在表达式开始位置加 ​​(?m)​​ 标记。如下所示:
match => {
  "message" => "(?m)\s+(?<request_time>\d+(?:\.\d+)?)\s+"
}
注意:本示例存在换行的日志,如果不配置多行匹配,表达式将无法正确匹配

三、正则示例

1.log日志
2020-04-13 10:48:03.347 |-ERROR [https-jsse-nio-8080-exec-7] com.asyf.demo.common.GlobalExceptionHandler [27] -| java.lang.IllegalStateException: Optional int parameter 'num' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
  at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleNullValue(AbstractNamedValueMethodArgumentResolver.java:245)
注意:日志中要存在换行、预定义表达式不支持的内容。

2.正则表达式
%{TIMESTAMP_ISO8601:timestamp}\s*\|\-%{LOGLEVEL:log_level}\s*\[%{DATA:thread}\]\s*(?m)(?<msg>.*|\s)
注意:表达式中使用了官方预定义的 grok 表达式、自定义表达式、多行匹配。

3.调试结果
{
  "timestamp": [
  [
    "2020-04-13 10:48:03.347"
  ]
  ],
  "YEAR": [
  [
    "2020"
  ]
  ],
  "MONTHNUM": [
  [
    "04"
  ]
  ],
  "MONTHDAY": [
  [
    "13"
  ]
  ],
  "HOUR": [
  [
    "10",
    null
  ]
  ],
  "MINUTE": [
  [
    "48",
    null
  ]
  ],
  "SECOND": [
  [
    "03.347"
  ]
  ],
  "ISO8601_TIMEZONE": [
  [
    null
  ]
  ],
  "log_level": [
  [
    "ERROR"
  ]
  ],
  "thread": [
  [
    "https-jsse-nio-8080-exec-7"
  ]
  ],
  "msg": [
  [
    "com.asyf.demo.common.GlobalExceptionHandler [27] -| java.lang.IllegalStateException: Optional int parameter 'num' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleNullValue(AbstractNamedValueMethodArgumentResolver.java:245)"
  ]
  ]
}


四、logstash配置

1.配置
filter {
      grok {
        match => { "message" =>"%{TIMESTAMP_ISO8601:timestamp}\s*\|\-%{LOGLEVEL:log_level}\s*\[%{DATA:thread}\]\s*(?m)(?<msg>.*|\s)" }
        remove_field => ["message","_source"]
      }
}
grok正则自定义的字段增加到日志中,remove_field删除的字段不再记录,这就是grok正则的目的。
更多请参考:​​https://www.elastic.co/guide/en/logstash/7.6/plugins-filters-grok.html​​

2.在kibana中查看结果
DSC0000.png


五、总结
认真阅读文档,多搜索博客,总会有结果的。




关注下面的标签,发现更多相似文章