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