一、文档地址
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中查看结果
五、总结
认真阅读文档,多搜索博客,总会有结果的。