一、文档地址

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中查看结果

五、总结

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

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐