湛蓝之海 发表于 2021-12-31 14:57:35

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

一、文档地址
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 com.asyf.demo.common.GlobalExceptionHandler -| 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 -| 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中查看结果


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




https://blog.51cto.com/u_14998860/4867428
页: [1]
查看完整版本: logstash之Grok插件正则表达式使用示例