同福

Logstash使用grok工具提取日志字段信息的方法【20220222】

介绍

介绍

今天福哥要带着大家学习Logstash的grok工具的使用技巧。grok是一个日志编辑工具,通过grok可以针对传入的日志数据进行随心所欲的编辑,包括字段提取、添加字段、删除字段等等。

根据ELK的设计思想日志最好是存储到ES引擎里面方便后面的日志查询和日志分析,而ES引擎的存储格式是JSON格式,但是各种软件的日志不一定是JSON格式的,这个时候就需要通过grok把传入的各种格式的日志数据转换成JSON格式了。

提取器

语法

格式

%{[提取器]:[字段名称]}

示例

%{IPV4:clientIP}

常用范例

IPORHOST

数据为IP地址或者主机名称。

USER

数据为用户名或者密码。

HTTPDATE

数据为HTTP风格的日期。类似如下格式:

21/Feb/2022:21:56:50 +0800

WORD

数据为字符串。

DATA

数据为数据。

NUMBER

数据为普通数字,包括int和float。

%{NUMBER:bytes}

数据为整型数字。

%{NUMBER:status:int}

QS

数据为双引号括起来的字符串类型。

更多范例

https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns

实践

Nginx

福哥以nginx的access.log的日志为例,做一个解析日志数据字段的配置例子。

home/topic/2022/0224/11/c44c1e7a0e01fb391220ed2ff732ec08.png

原始日志格式

这是nginx记录到access.log日志文件里面的数据格式。

home/topic/2022/0224/11/894b92712c5271c778ee6290e5ec8839.png

grok解析

filter {
  if "access.log" in [log][file][path] {
    grok {
      match => {
        "message" => "%{IPORHOST:clientip} \- %{USER:user} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:httpstatus:int} %{NUMBER:bytes:int} %{QS:referrer} %{QS:useragent}"
      }
    }
    mutate {
      gsub => ["useragent", "\"", ""]
      gsub => ["referrer", "\"", ""]
      remove_field => ["agent", "ecs", "event", "message", "tags"]
    }
  }
}

改造过日志格式

home/topic/2022/0224/11/1bdb83cea1d8882b42a9988b44ab284c.png

总结

今天福哥带着童鞋们学习了Logstash的grok工具的日志字段提取的技巧,可以看出来通过grok提取日志字段之后可以将普通的文本格式的数据拆分出一个一个的字段组合成JSON格式的数据,JSON格式的数据可以通过Logstash存储到ES引擎里面,这样就可以通过ES引擎进行各种分析处理了。