一架梯子,一头程序猿,仰望星空!

Logstash grok filter插件


通过grok filter插件我们可以对文本内容进行格式化处理,提取文本中的内容,并将其转换成json格式,在处理日志内容的时候非常有用。

例子:

例如日志内容如下:

55.3.244.1 GET /index.html 15824 0.043

这条日志内容包含了ip、http请求方法、请求路径、响应内容大小、响应时间,这条日志是一行字符串,我们可以通过grok将其格式化为:client、method、request、bytes、duration这几个字段,然后在保存到elasticsearch中。

logstash配置:

input {
  # 扫描指定文件日志数据
  file {
    path => [ "/var/log/http.log" ]
  }
}
# 配置过滤器插件,对Input收集到的数据进行格式化处理
filter {
   # 通过grok插件,格式化文本内容
   grok {
      # grok参数,这里决定如何对每一行日志进行参数提取
      # message 字段的内容就是格式化日志的表达式
      match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
   }
}

output {
  # 将数据导入到ES中
  elasticsearch {
    # ES服务地址
    hosts => ["http://localhost:9200"]
    # 索引名
    index => "tizi365" 
  }
}

通过grok提取的结果如下:

  • client: 55.3.244.1
  • method: GET
  • request: /index.html
  • bytes: 15824
  • duration: 0.043

grok模式语法

grok的提取字符串内容的语法其实就是在正则表达式基础之上进行封装,Logstash grok内置了120种默认表达式,解决很多日常需求,不需要重头编写复杂的正则表达式。

grok表达式语法:

%{模式名:自定义字段名}

说明:

  • 模式名 - 指的就是预先定义好的正则表达式的别名,例如:IP 可以匹配ip内容。
  • 自定义字段名 - 通过模式匹配到内容后,将内容保存到这个自定义的字段中

例子:

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

这是上面例子的grok表达式,下面是对表达式的解读:

  • %{IP:client} - 匹配IP内容,结果保存到client字段
  • %{WORD:method} - 匹配非空字符串内容,结果保存到method字段
  • %{URIPATHPARAM:request} - 匹配url路径,结果保存到request字段
  • %{NUMBER:bytes} - 匹配数字,结果保存到bytes字段

grok filter插件参数

参数名类型默认值说明
matchhash{}定义grok的表达式,格式: message => "表达式"
patterns_dirarray[]自定义模式配置文件的路径,支持多个路径,例子:["/opt/logstash/patterns", "/opt/logstash/extra_patterns"]

grok内置模式

常用模式

表达式标识名称详情匹配例子
USERNAME 或 USER用户名由数字、大小写及特殊字符(._-)组成的字符串1234、Bob、Alex.Wong
EMAILLOCALPART用户名首位由大小写字母组成,其他位由数字、大小写及特殊字符(_.+-=:)组成的字符串。注意,国内的QQ纯数字邮箱账号是无法匹配的,需要修改正则windcoder、windcoder_com、abc-123
EMAILADDRESS电子邮件 windcoder@abc.com、windcoder_com@gmail.com、abc-123@163.com
HTTPDUSERApache服务器的用户可以是EMAILADDRESS或USERNAME 
INT整数包括0和正负整数0、-123、43987
BASE10NUM 或 NUMBER十进制数字包括整数和小数0、18、5.23
BASE16NUM十六进制数字整数0x0045fa2d、-0x3F8709
WORD字符串包括数字和大小写字母String、3529345、ILoveYou
NOTSPACE不带任何空格的字符串  
SPACE空格字符串  
QUOTEDSTRING 或 QS带引号的字符串 "This is an apple"、'What is your name?'
UUID标准UUID 550E8400-E29B-11D4-A716-446655440000
MACMAC地址可以是Cisco设备里的MAC地址,也可以是通用或者Windows系统的MAC地址 
IPIP地址IPv4或IPv6地址127.0.0.1、FE80:0000:0000:0000:AAAA:0000:00C2:0002
HOSTNAMEIP或者主机名称  
HOSTPORT主机名(IP)+端口 127.0.0.1:3306、api.windcoder.com:8000
PATH路径Unix系统或者Windows系统里的路径格式/usr/local/nginx/sbin/nginx、c:\windows\system32\clr.exe
URIPROTOURI协议 http、ftp
URIHOSTURI主机 windcoder.com、10.0.0.1:22
URIPATHURI路径 //windcoder.com/abc/、/api.php
URIPARAMURI里的GET参数 ?a=1&b=2&c=3
URIPATHPARAMURI路径+GET参数/windcoder.com/abc/api.php?a=1&b=2&c=3 
URI完整的URI https://windcoder.com/abc/api.php?a=1&b=2&c=3
LOGLEVELLog表达式Log表达式Alert、alert、ALERT、Error

日期时间模式

表达式标识名称匹配例子
MONTH月份名称Jan、January
MONTHNUM月份数字03、9、12
MONTHDAY日期数字03、9、31
DAY星期几名称Mon、Monday
YEAR年份数字 
HOUR小时数字 
MINUTE分钟数字 
SECOND秒数字 
TIME时间00:01:23
DATE_US美国时间10-01-1892、10/01/1892/
DATE_EU欧洲日期格式01-10-1892、01/10/1882、01.10.1892
ISO8601_TIMEZONEISO8601时间格式+10:23、-1023
TIMESTAMP_ISO8601ISO8601时间戳格式2016-07-03T00:34:06+08:00
DATE日期美国日期%{DATE_US}或者欧洲日期%{DATE_EU} |
DATESTAMP完整日期+时间07-03-2016 00:34:06
HTTPDATEhttp默认日期格式03/Jul/2016:00:36:53 +0800

Grok自带的模式,具体的规则可以参考下面链接

https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

自定义模式

如果grok内置的模式无法满足需求,也可以自定义模式。

模式定义语法:

NAME PATTERN

说明:

  • NAME - 模式名
  • PATTERN - 表达式,包括正则表达式和logstash变量。

例子:

步骤1:

配置文件路径:/opt/logstash/tizi_patterns ,文件内容如下

TIZI_NUMBER \d+

提示:自定义模式配置文件路径,可以根据项目情况自定义即可

步骤2:

在logstash配置文件中引用自定义表达式

filter {
   grok {
      # 指定自定义模式路径
      patterns_dir => ["/opt/logstash/tizi_patterns"]
      # 使用自定义模式
      match => { "message" => "%{TIZI_NUMBER:tizi_data}" }
   }
}

调试grok模式

Kibana支持在线调试grok,如下截图: