一、前言
近期需要對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 | [1-9]\d{5} | 國內郵政編碼 |
GAME_ACCOUNT | [a-zA-Z][a-zA-Z0-9_]{4,15} | 游戲賬號,首字符為字母,4-15位字母、數字、下划線組成 |
還有很多,需要您在業務中靈活運用!