look321 发表于 2019-1-29 13:20:46

关于Logstash中grok插件的正则表达式例子

  一、前言
  近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属。
  Logstash负责采集日志,Elasticsearch负责存储、索引日志,Kibana则负责通过Web形式展现日志。
  今天,我要说的是Logstash,它可以从多种渠道采集数据,包括控制台标准输入、日志文件、队列等等,只要你能想到,都可以通过插件的方式实现。
  其中,日志源提供的日志格式可能并不是我们想要插入存储介质里的格式,所以,Logstash里提供了一系列的filter来让我们转换日志。
  Grok就是这些filters里最重要的一个插件,下面我就说说它。
二、Grok提供的常用Patterns说明及举例
  大多数Linux使用人员都有过用正则表达式来查询机器中相关文件或文件里内容的经历,在Grok里,我们也是使用正则表达式来识别日志里的相关数据块。
  有两种方式来使用正则表达式:

[*]  直接写正则来匹配
[*]  用Grok表达式映射正则来匹配
  在我看来,每次重新写正则是一件很痛苦的事情,为什么不用表达式来一劳永逸呢?
  特别提示:Grok表达式很像C语言里的宏定义
  要学习Grok的默认表达式,我们就要找到它的具体配置路径,路径如下:
# Windows下路径[你的logstash安装路径]\vendor\bundle\jruby\x.x\gems\logstash-patterns-core-x.x.x\patterns\grok-patterns  现在对常用的表达式进行说明:
常用表达式

[*]  USERNAME 或 USER
  用户名,由数字、大小写及特殊字符(._-)组成的字符串
  比如:1234、Bob、Alex.Wong等

[*]  EMAILLOCALPART
  电子邮件用户名部分,首位由大小写字母组成,其他位由数字、大小写及特殊字符(_.+-=:)组成的字符串。注意,国内的QQ纯数字邮箱账号是无法匹配的,需要修改正则
  比如:stone、Gary_Lu、abc-123等

[*]  EMAILADDRESS
  电子邮件
  比如:stone@abc.com、Gary_Lu@gmail.com、abc-123@163.com等

[*]  HTTPDUSER
  Apache服务器的用户,可以是EMAILADDRESS或USERNAME
[*]  INT
  整数,包括0和正负整数
  比如:0、-123、43987等

[*]  BASE10NUM 或 NUMBER
  十进制数字,包括整数和小数
  比如:0、18、5.23等

[*]  BASE16NUM
  十六进制数字,整数
  比如:0x0045fa2d、-0x3F8709等

[*]  BASE16FLOAT
  十六进制数字,整数和小数
[*]  WORD
  字符串,包括数字和大小写字母
  比如:String、3529345、ILoveYou等

[*]  NOTSPACE
  不带任何空格的字符串
[*]  SPACE
  空格字符串
[*]  QUOTEDSTRING 或 QS
  带引号的字符串
  比如:"This is an apple"、'What is your name?'等

[*]  UUID
  标准UUID
  比如:550E8400-E29B-11D4-A716-446655440000

[*]  MAC
  MAC地址,可以是Cisco设备里的MAC地址,也可以是通用或者Windows系统的MAC地址
[*]  IP
  IP地址,IPv4或IPv6地址
  比如:127.0.0.1、FE80:0000:0000:0000:AAAA:0000:00C2:0002等

[*]  HOSTNAME
  主机名称
[*]  IPORHOST
  IP或者主机名称
[*]  HOSTPORT
  主机名(IP)+端口
  比如:127.0.0.1:3306、api.stozen.NET:8000等

[*]  PATH
  路径,Unix系统或者Windows系统里的路径格式
  比如:/usr/local/nginx/sbin/nginx、c:\windows\system32\clr.exe等

[*]  URIPROTO
  URI协议
  比如:http、ftp等

[*]  URIHOST
  URI主机
  比如:www.stozen.Net、10.0.0.1:22等

[*]  URIPATH
  URI路径
  比如://www.stozen.net/abc/、/api.PHP等

[*]  URIPARAM
  URI里的GET参数
  比如:?a=1&b=2&c=3

[*]  URIPATHPARAM
  URI路径+GET参数
  比如://www.stozen.net/abc/api.php?a=1&b=2&c=3

[*]  URI
  完整的URI
  比如:http://www.stozen.net/abc/api.php?a=1&b=2&c=3

日期时间表达式

[*]  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-15-1982、10/15/1982等

[*]  DATE_EU
  欧洲日期格式
  比如:15-10-1982、15/10/1982、15.10.1982等

[*]  ISO8601_TIMEZONE
  ISO8601时间格式
  比如:+10:23、-1023等

[*]  TIMESTAMP_ISO8601
  ISO8601时间戳格式
  比如:2016-07-03T00:34:06+08:00

[*]  DATE
  日期,美国日期%{DATE_US}或者欧洲日期%{DATE_EU}
[*]  DATESTAMP
  完整日期+时间
  比如:07-03-2016 00:34:06

[*]  HTTPDATE
  http默认日期格式
  比如:03/Jul/2016:00:36:53 +0800

Log表达式

[*]  LOGLEVEL
  日志等级
  比如:Alert、alert、ALERT、Error等

三、创建自己的Grok表达式
  在业务领域中,可能会有越来越多的日志格式出现在我们眼前,而Grok的默认表达式显然已无法满足我们的需求(比如用户身份证号、手机号等信息),所以,我们需要自己动手添加些表达式。
表达式正则表达式说明DATE_CHS%{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY}中国人习惯的日期格式ZIPCODE_CHS\d{5}国内邮政编码GAME_ACCOUNT{4,15}游戏账号,首字符为字母,4-15位字母、数字、下划线组成  还有很多,需要您在业务中灵活运用!


页: [1]
查看完整版本: 关于Logstash中grok插件的正则表达式例子