1. 程式人生 > >關於Logstash中grok外掛的正則表示式例子

關於Logstash中grok外掛的正則表示式例子

一、前言

近期需要對Nginx產生的日誌進行採集,問了下度娘,業內最著名的解決方案非ELK(Elasticsearch, Logstash, Kibana)莫屬。

Logstash負責採集日誌,Elasticsearch負責儲存、索引日誌,Kibana則負責通過Web形式展現日誌。

今天,我要說的是Logstash,它可以從多種渠道採集資料,包括控制檯標準輸入、日誌檔案、佇列等等,只要你能想到,都可以通過外掛的方式實現。

其中,日誌源提供的日誌格式可能並不是我們想要插入儲存介質裡的格式,所以,Logstash裡提供了一系列的filter來讓我們轉換日誌

Grok就是這些filters裡最重要的一個外掛,下面我就說說它。

二、Grok提供的常用Patterns說明及舉例

大多數Linux使用人員都有過用正則表示式來查詢機器中相關檔案或檔案裡內容的經歷,在Grok裡,我們也是使用正則表示式來識別日誌裡的相關資料塊。

有兩種方式來使用正則表示式:
1. 直接寫正則來匹配
2. 用Grok表示式對映正則來匹配

在我看來,每次重新寫正則是一件很痛苦的事情,為什麼不用表示式來一勞永逸呢?

特別提示:Grok表示式很像C語言裡的巨集定義

要學習Grok的預設表示式,我們就要找到它的具體配置路徑,路徑如下:

# Windows下路徑
[你的logstash安裝路徑]\vendor\bundle
\jruby\x.x\gems\logstash-patterns-core-x.x.x\patterns\grok-patterns

現在對常用的表示式進行說明:

常用表示式

  • USERNAME 或 USER
    使用者名稱,由數字、大小寫及特殊字元(._-)組成的字串

    比如:1234BobAlex.Wong

  • EMAILLOCALPART
    電子郵件使用者名稱部分,首位由大小寫字母組成,其他位由數字、大小寫及特殊字元(_.+-=:)組成的字串。注意,國內的QQ純數字郵箱賬號是無法匹配的,需要修改正則

    比如:stoneGary_Luabc-123

  • EMAILADDRESS
    電子郵件

    比如:[email protected][email protected][email protected]

  • HTTPDUSER
    Apache伺服器的使用者,可以是EMAILADDRESSUSERNAME

  • INT
    整數,包括0和正負整數

    比如:0-12343987

  • BASE10NUM 或 NUMBER
    十進位制數字,包括整數和小數

    比如:0185.23

  • BASE16NUM
    十六進位制數字,整數

    比如:0x0045fa2d-0x3F8709

  • BASE16FLOAT
    十六進位制數字,整數和小數

  • WORD
    字串,包括數字和大小寫字母

    比如:String3529345ILoveYou

  • 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.1FE80:0000:0000:0000:AAAA:0000:00C2:0002

  • HOSTNAME
    主機名稱

  • IPORHOST
    IP或者主機名稱

  • HOSTPORT
    主機名(IP)+埠

    比如:127.0.0.1:3306api.stozen.net:8000

  • PATH
    路徑,Unix系統或者Windows系統裡的路徑格式

    比如:/usr/local/nginx/sbin/nginxc:\windows\system32\clr.exe

  • URIPROTO
    URI協議

    比如:httpftp

  • URIHOST
    URI主機

    比如:www.stozen.net10.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
    月份名稱

    比如:JanJanuary

  • MONTHNUM
    月份數字

    比如:03912

  • MONTHDAY
    日期數字

    比如:03931

  • DAY
    星期幾名稱

    比如:MonMonday

  • YEAR
    年份數字

  • HOUR
    小時數字

  • MINUTE
    分鐘數字

  • SECOND
    秒數字

  • TIME
    時間

    比如:00:01:23

  • DATE_US
    美國日期格式

    比如:10-15-198210/15/1982

  • DATE_EU
    歐洲日期格式

    比如:15-10-198215/10/198215.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
    日誌等級
比如:AlertalertALERTError

三、建立自己的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位字母、數字、下劃線組成

還有很多,需要您在業務中靈活運用!

相關推薦

關於Logstashgrok外掛表示式例子

一、前言 近期需要對Nginx產生的日誌進行採集,問了下度娘,業內最著名的解決方案非ELK(Elasticsearch, Logstash, Kibana)莫屬。 Logstash負責採集日誌,Elasticsearch負責儲存、索引日誌,Kibana則負責

Logstash grok-patterns ( 表示式 )

git  https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns    #  grok  git grok debug  http

logStash攔截器grok表示式(五)

從github上拷貝下來 留著以後檢視備用 USERNAME [a-zA-Z0-9._-]+ USER %{USERNAME} EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+ EMAILADDRESS %{EMAILLOC

Python常用的表示式

正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。(非python獨有,但是python的re模組提供了實現,在python中寫正則表示式幾乎都用這個庫) 樣例展示: 這裡要用到線上正則

jsstring之表示式replace方法詳解

本篇文章主要介紹了js中string之正則表示式replace方法詳解,replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物件的方法。 replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物

python常用的表示式符號

'.' 預設匹配除\n之外的任意一個字元,若指定flag DOTALL,則匹配任意字元,包括換行 '^' 匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE) '$' 匹配字元結尾,或e

Nginx模組開發使用PCRE表示式匹配

Nginx內部對pcre庫的常用操作進行了封裝. 封裝的原始碼位於nginx/src/core/ngx_regex.c, 同時將pcre內使用的記憶體池更變為了Nginx的記憶體池. pcre_compile: Nginx封裝了pcre_compile方法. 方法名為ngx_regex_

工作常用的表示式

一、正整數 /^[1-9]\d*$/ 二、8-20位數字、字母組合,不能是單純的數字或字母 /^(?![0-9]+$)(?![A-Za-z]+$)[0-9A-Za-z\\W]{8,20}$/ 三、請輸入正確的手機號 /^1[3456789]\d{9}$/

Java 實際應用常用的表示式

1.正則表示式 jdk1.4 開始提供了正則表示式的支援; java.util.regex Pattern類:此類物件如果想要獲得必須使用compile(), 此方法的功能式編譯正則 Matcher類:通過Patern類取得;2.正則標記  1.所有的正則可以使用的標記都在java.uti

SAP HANA資料庫如何使用表示式

        作為一個程式設計師小白,剛進公司上班兩個周,我開始熟悉並參與公司的一個專案(當然,只是做一些最簡單的查詢來練練手啦,複雜的也不會。。。),帶我的同事讓我在某個表的資料列表頁面設定幾個按鈕,來根據過期狀態查詢記錄,於是我開始了,這個專案的資料庫是用hana來管理

Python中文文字資訊抽取常見的表示式

我在使用python做一些文字資訊抽取的時候,用到了python的正則表示式匹配。所以這裡對常見的python正則表示式做一個歸納。找乾貨直接看粗體字 本文使用的是python2.7.13版本直譯器。 要點包括:中文的正則匹配,python的編碼格式,re包

Python使用中文表示式匹配指定的中文字串

業務場景: 從中文字句中匹配出指定的中文子字串 .這樣的情況我在工作中遇到非常多, 特梳理總結如下. 難點: 處理GBK和utf8之類的字元編碼, 同時正則匹配Pattern中包含漢字,要漢字正常發揮作用,必須非常謹慎.推薦最好統一為utf8編碼,如果不是這種最優情況,也有

PHP常用的表示式收藏

儘管PHP中使用正則表示式不如直接使用相應的函式效率高,但是正則表示式的方便,容易理解的特性使得在小型網站中使用量比較高,本文收集了一些常用的正則表示式。 1、匹配中文字元的正則表示式: [\u4e00-\u9fa5]   說明:匹配中文還真是個頭疼的事,有了這個

python如何用表示式匹配漢字

 由於 需求原因,需要匹配 提取中文,大量google下,並沒有我需要的。花了一個小時大概測試,此utf8中文通過,特留文。   參考: http://hi.baidu.com/nivrrex/blog/item/e6ccaf511d0926888d543071.html          http://to

shell常用的表示式2

一個正則表示式就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進行匹配。 / hmcLinux聯盟將下一個字元標記為一個特殊字元、或一個原義字元、或一個 後向引用、或一個八

[小知識] grep如何使用表示式匹配數字

如何使用grep搜尋包含數字的行? 記得“\d”可以表示任意數字,遂寫成grep "\d" test.txt  沒有返回任何資料, 難道不支援“\d” 你在命令列下執行man grep 檢視幫助,可以看到grep是支援多種正則表示式的,需要用引數去切換。 Matche

iOS-字串替換-表示式-例子

- (NSString *)replaceImageHtml:(NSString *)oldHtml { NSString *regex = @"(<img.*?/>)"; NSRange r; NSMutableString *newHtml = [NSMutableS

js去除字串所有空格表示式

//定義一個字串var str = " he  llo ";//剔除所有空格var conStr = str .replace(/\s+/g,"");//列印資訊到瀏覽器控制檯console.info(conStr );控制檯輸出資訊:hello

Python使用表示式例子

###正則表示式有什麼用? 正則表示式的恰當運用可以提高查詢效率 減少程式碼量,便於維護 簡單易學,適用於所有程式語言 ###下面來看一些例子 import re s = '38x1x234x35x612x3yxxx' patten1 = re.comp

java-grok通過表示式解析日誌

     專案中有一個新的需求,就是需要解析日誌,將日誌中的部分資料分析獲取出來供系統使用,通俗的講就是抓取日誌中的部分有用的資訊,比如下面的apache日誌資訊,我需要解析每行日誌,獲取每行日誌的IP地址、使用者、建立時間、請求方式、地址....如果我們單純使用java的