grok語法定義和自己實踐


grok語法定義

grok默認表達式

Logstash 內置了120種默認表達式,可以查看patterns,里面對表達式做了分組,每個文件為一組,文件內部有對應的表達式模式。下面只是部分常用的。

常用表達式

表達式標識

名稱

詳情

匹配例子

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

HTTPDUSER

Apache服務器的用戶

可以是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

MAC

MAC地址

可以是Cisco設備里的MAC地址,也可以是通用或者Windows系統的MAC地址

 

IP

IP地址

IPv4或IPv6地址

127.0.0.1、FE80:0000:0000:0000:AAAA:0000:00C2:0002

HOSTNAME

IP或者主機名稱

   

HOSTPORT

主機名(IP)+端口

 

127.0.0.1:3306、api.windcoder.com:8000

PATH

路徑

Unix系統或者Windows系統里的路徑格式

/usr/local/nginx/sbin/nginx、c:\windows\system32\clr.exe

URIPROTO

URI協議

 

http、ftp

URIHOST

URI主機

 

windcoder.com、10.0.0.1:22

URIPATH

URI路徑

 

//windcoder.com/abc/、/api.php

URIPARAM

URI里的GET參數

 

?a=1&b=2&c=3

URIPATHPARAM

URI路徑+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

LOGLEVEL

Log表達式

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_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

 

自定義grok表達式

語法解釋:
%{HOSTNAME},匹配請求的主機名
%{TIMESTAMP_ISO8601:time},代表時間戳
%{LOGLEVEL},代表日志級別
%{URIPATHPARAM},代表請求路徑
%{INT},代表字符串整數數字大小
%{NUMBER}, 可以匹配整數或者小數

%{UUID},匹配類似091ece39-5444-44a1-9f1e-019a17286b48
%{IP}, 匹配ip
%{WORD}, 匹配請求的方式
%{GREEDYDATA},匹配所有剩余的數據
(?([\S+]*)),自定義正則
\s*或者\s+,代表多個空格
\S+或者\S*,代表多個字符
大括號里面:xxx,相當於起別名

(?<class_info>([\S+]*)), 自定義正則匹配多個字符

舉例操作如下:

列1:
[2019-08-22 12:25:51.441] [TSC_IHU] [ERROR] [c.e.c.t.i.t.s.IhuTsaUplinkServiceImpl] Activation/Bind uplink, query UserSession by Token failure!

grok調試如下:
\[%{TIMESTAMP_ISO8601:time}\]\s*%{DATA:thread}\s*\[%{LOGLEVEL:level}\]\s*%{GREEDYDATA:data}

 

 

列2:

2019-09-12 14:16:36.320+08:00 INFO 930856f7-c78f-4f12-a0f1-83a2610b2dfc DispatcherConnector ip-192-168-114-244 [Mqtt-Device-1883-worker-18-1] com.ericsson.sep.dispatcher.api.transformer.v1.MessageTransformer {"TraceID":"930856f7-c78f-4f12-a0f1-83a2610b2dfc","clientId":"5120916600003466K4GA1059","username":"LB37622Z3KX609880"}

%{TIMESTAMP_ISO8601:access_time}\s*%{LOGLEVEL:level}\s*%{UUID:uuid}\s*%{WORD:word}\s*%{HOSTNAME:hostname}\s*\[%{DATA:work}\]\s*(?<api>([\S+]*))\s*(?<TraceID>([\S+]*))\s*%{GREEDYDATA:message_data}

 

 列3:

192.168.125.138 - - [12/Sep/2019:14:10:58 +0800] "GET /backend/services/ticketRemind/query?cid=&msgType=1&pageSize=100&pageIndex=1&langCode=zh HTTP/1.1" 200 91

grok調試如下:

 %{IP:ip}\s*%{DATA:a}\s*\[%{HTTPDATE:access_time}\]\s*%{DATA:b}%{WORD:method}\s*%{URIPATH:url}%{URIPARAM:param}\s*%{URIPROTO:uri}%{DATA:c}%{NUMBER:treaty}%{DATA:d}\s*%{NUMBER:status}\s*%{NUMBER:latency_millis}

 

 列4:

[08/Nov/2019:11:40:24 +0800] tc-com.g-netlink.net - - 192.168.122.58 192.168.122.58 192.168.125.135 80 GET 200 /geelyTCAccess/tcservices/capability/L6T7944Z0JN427155 ?pageIndex=1&pageSize=2000&vehicleType=0 21067 17

 grok調試如下:

\[%{HTTPDATE:access_time}\] %{DATA:hostname} %{DATA:username} %{DATA:fwd_for} %{DATA:remote_hostname} %{IP:remote_ip} %{IP:local_ip} %{NUMBER:local_port} %{DATA:method} %{DATA:status} %{DATA:uri} %{DATA:query} %{NUMBER:bytes} %{NUMBER:latency_ms}

 

#############################################################以上內容為轉載########################################

例子:

2020-08-13 00:00:08,452 [DEBUG]--[e3ad934b39da4b3d9810f2476ada5574] n.a.h.u.s.c.d.m.U.selectList 159 -- ==> Parameters: 2(String), 09fe98c24a904cc6b27169f3c72f7a5a(String)
以上日志 ===> gork解析語法:"%{TIMESTAMP_ISO8601:time}\\s*\\[%{LOGLEVEL:level}\\s*\\]\\-\\-\\[%{WORD:uuid}\\]%{GREEDYDATA:JAVALOG}"
匹配到結果如下:
"_source": {
"JAVALOG": " n.a.h.u.s.c.d.m.U.selectList 159 -- ==> Parameters: 2(String), 09fe98c24a904cc6b27169f3c72f7a5a(String)",
"level": "DEBUG",
"time": "2020-08-13 00:00:08,452",
"uuid": "e3ad934b39da4b3d9810f2476ada5574"
}

執行結果如下圖:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "grok processor",
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{TIMESTAMP_ISO8601:time}\\s*\\[%{LOGLEVEL:level}\\s*\\]\\-\\-\\[%{WORD:uuid}\\]%{GREEDYDATA:JAVALOG}"
          ]
        }
      },
      {
       "remove": {
         "field": "message"
       }
      }
    ]
  },
  "docs": [
    {
      "_index": "index",
      "_type": "type",
      "_id": "id",
      "_source": {
        "message": "2020-08-13 00:00:08,452 [DEBUG]--[e3ad934b39da4b3d9810f2476ada5574] n.a.h.u.s.c.d.m.U.selectList 159 -- ==> Parameters: 2(String), 09fe98c24a904cc6b27169f3c72f7a5a(String)"
      }
    }
  ]
}
View Code

 【注意remove的Processor只是把原始的message去掉 不然就重復了。我在kibana使用“\”的時候報錯,改為“\\”就正常】

  

后來日志格式有所改變:

2020-09-17 14:34:00,996 [http-nio-15005-exec-11] [INFO ]--[aede806b38b145868bd07f44aeec6f70] n.a.h.user.server.common.util.AspectUtil 39 -- 方法請求參數 : $Proxy150.selectOne([com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper@d6061c3])

 

GET /_ingest/pipeline/_simulate?pretty
{
  "pipeline": {
    "description": "字符串首字母轉換成大寫",
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            """%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:trace-id}\s*\]\s*\[%{LOGLEVEL:level}\s*\]\-\-\[%{WORD:uuid}\]%{GREEDYDATA:JAVALOG}"""
          ]
        }
      },
      {
        "remove": {
          "field": "message"
        }
      }
    ]
  },
  "docs": [
    {
      "_index": "index",
      "_type": "type",
      "_id": "id",
      "_source": {
        "message":"2020-09-17 14:34:00,996 [http-nio-15005-exec-11] [INFO ]--[aede806b38b145868bd07f44aeec6f70] n.a.h.user.server.common.util.AspectUtil 39 -- 方法請求參數 : $Proxy150.selectOne([com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper@d6061c3])"
      }
    }
  ]
}
View Code

 

 

 

 

gork解析法網站

http://grokdebug.herokuapp.com/

 

 

 

【01遇到問題】業務異常日志時候,filebeat 會使用多行合並功能 但發現除了第一行匹配到的能到es里面,其他的都沒有匹配到,分析是%{GREEDYDATA:JAVALOG}只能匹配到一行所有。但不能匹配到 換行符 | 回符車。所以除了第一行其他都不能匹配,網上查到使用 (?<JAVALOG>(.|\r|\n)*) ,JAVALOG是自己定義)可以貪婪匹配。

 

 

PUT _ingest/pipeline/cut_java_log02
{
    "description": "cut_java_log",
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            """%{TIMESTAMP_ISO8601:time}\s*\[%{DATA:thread-id}\s*\]\s*\[%{LOGLEVEL:level}\s*\]\-\-\[%{WORD:trace-id}\](?<JAVALOG>(.|\r|\n)*)"""
          ]
        }
      },
      {
        "remove": {
          "field": "message"
        }
      }
    ]
}
View Code

 

【02遇到問題】當一個日志文件里面有2種格式的時候,就需要使用到-當不匹配的時候怎么處理的問題。

參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/fail-processor.html

GET _ingest/pipeline/cut_java_log03
{
  "cut_java_log03" : {
    "description" : "cut_java_log",
    "processors" : [
      {
        "grok" : {
          "field" : "message",
          "patterns" : [
            "%{TIMESTAMP_ISO8601:time}\\s*\\[%{DATA:trace-id}\\s*\\]\\s*\\[%{LOGLEVEL:level}\\s*\\]\\-\\-\\[%{WORD:uuid}\\]%{GREEDYDATA:JAVALOG}"
          ]
        }
      },
      {
        "remove" : {
          "field" : "message"
        }
      }
    ],
    "on_failure" : [
      {
        "grok" : {
          "field" : "message",
          "patterns" : [
            "(?<JAVALOG>(.|\\r|\\n)*)"
          ]
        }
      },
      {
        "remove" : {
          "field" : "message"
        }
      }
    ]
  }
}
View Code

 

 

Elasticsearch Pipeline 詳解

felayman個人博客,專注於Elasticsearch搜索技術 

https://www.felayman.com/articles/2017/11/24/1511527532643.html#b3_solo_h3_3 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM