近期须要对Nginx
产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK
(Elasticsearch
, Logstash
, Kibana
)莫属。php
Logstash
负责采集日志,Elasticsearch
负责存储、索引日志,Kibana
则负责经过Web形式展示日志。html
今天,我要说的是Logstash
,它能够从多种渠道采集数据,包括控制台标准输入、日志文件、队列等等,只要你能想到,均可以经过插件的方式实现。nginx
其中,日志源提供的日志格式可能并非咱们想要插入存储介质里的格式,因此,Logstash里提供了一系列的filter来让咱们转换日志。正则表达式
Grok
就是这些filters里最重要的一个插件,下面我就说说它。windows
大多数Linux使用人员都有过用正则表达式来查询机器中相关文件或文件里内容的经历,在Grok里,咱们也是使用正则表达式来识别日志里的相关数据块。api
有两种方式来使用正则表达式:ruby
在我看来,每次从新写正则是一件很痛苦的事情,为何不用表达式来一劳永逸呢?服务器
特别提示:Grok表达式很像C语言里的宏定义app
要学习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
等
EMAILADDRESS
或USERNAME
INT
整数,包括0和正负整数
好比:
0
、-123
、43987
等
BASE10NUM 或 NUMBER
十进制数字,包括整数和小数
好比:
0
、18
、5.23
等
BASE16NUM
十六进制数字,整数
好比:
0x0045fa2d
、-0x3F8709
等
WORD
字符串,包括数字和大小写字母
好比:
String
、3529345
、ILoveYou
等
QUOTEDSTRING 或 QS
带引号的字符串
好比:
"This is an apple"
、'What is your name?'
等
UUID
标准UUID
好比:
550E8400-E29B-11D4-A716-446655440000
IP
IP地址,IPv4或IPv6地址
好比:
127.0.0.1
、FE80:0000:0000:0000:AAAA:0000:00C2:0002
等
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
等
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_US}
或者欧洲日期%{DATE_EU}
DATESTAMP
完整日期+时间
好比:
07-03-2016 00:34:06
HTTPDATE
http默认日期格式
好比:
03/Jul/2016:00:36:53 +0800
LOGLEVEL
日志等级
好比:
Alert
、alert
、ALERT
、Error
等
在业务领域中,可能会有愈来愈多的日志格式出如今咱们眼前,而Grok的默认表达式显然已没法知足咱们的需求(好比用户身份证号、手机号等信息),因此,咱们须要本身动手添加些表达式。
表达式 | 正则表达式 | 说明 |
---|---|---|
DATE_CHS | %{YEAR}[./-]%{MONTHNUM}[./-]%{MONTHDAY} | 中国人习惯的日期格式 |
ZIPCODE_CHS | [1-9]\d{5} | 国内邮政编码 |
GAME_ACCOUNT | [a-zA-Z][a-zA-Z0-9_]{4,15} | 游戏帐号,首字符为字母,4-15位字母、数字、下划线组成 |
还有不少,须要您在业务中灵活运用!