Skip to content

Grok Parser

Sun Jianbo edited this page Jun 22, 2017 · 13 revisions

Grok Parser是一个类似于Logstash Grok Parser一样的解析配置方式,其本质是按照正则表达式匹配解析日志。

典型配置如下

    "parser":{
        "name":"nginx_parser",
        "type":"grok",
        "grok_mode":"",#默认为空
        "grok_patterns":"%{QINIU_LOG_FORMAT}",
        "grok_custom_pattern_files":"/etc/logkit/pattern1,/etc/logkit/pattern2",
        "grok_custom_patterns":"",
        "timezone_offset":"+08",
        "labels":"machine nb110,team pandora"
    },
  • grok_patterns 是按照逗号分隔的字符串,每个部分格式按照字段名 字段类型构成,字段类型现在支持string, long, jsonmap, float
  • labels 填一些额外的标签信息,同样逗号分隔,每个部分由空格隔开,左边是标签的key,右边是value。
  • grok_mode 指定grok_modemulti 可以针对多行日志解析,。grok和普通正则一样,默认是不支持匹配回车换行,只针对单行进行解析。注意:指定为multi以后,grok会把日志中的换行符替换为空格解析。同时若grok parser希望解析多行,则需要在reader模块填写 head_pattern 行首正则表达式。
  • patterns 填写解析日志的grok pattern名称,包括一些logkit自身内置的patterns以及自定义的pattern名称,以及社区的常见grok pattern,如logstash的内置pattern以及常见的grok库pattern
    • 填写方式是%{QINIU_LOG_FORMAT},%{COMMON_LOG_FORMAT},以百分号和花括号包裹pattern名称,多个pattern名称以逗号分隔。
    • 实际匹配过程中会按顺序依次去parse文本内容,以第一个匹配的pattern解析文本内容。
    • 需要注意的是,每多一个pattern,解析时都会多解析一个,直到成功为止,所以pattern的数量多有可能降低解析的速度,在数据量大的情况下,建议一个pattern解决数据解析问题。
  • grok_custom_patterns 用户自定义的grok pattern内容,需符合logkit自定义pattern的写法,按行分隔,参见自定义pattern的写法和用法说明
  • grok_custom_pattern_files 用户自定义的一些grok pattern文件,当自定义pattern太长太多,建议用文件功能。 !!!注意:如果修改pattern文件,需要更新logkit Runner相关配置文件,或者重启logkit才能生效!!!
  • Grok Parser中解析出的字段 就是grok表达式中命名的字段,还包括labels中定义的标签名,可以在sender中选择需要发送的字段和标签。
  • timezone_offset 解析出的时区信息默认为UTC时区,使用timezone_offset可以修改时区偏移量,默认偏移量为0,写法为"+08"、"08"、"8" 均表示比读取时间加8小时,"-08","-8",表示比读取的时间减8小时。若实际为东八区时间,读取为UTC时间,则实际多读取了8小时,需要写"-8",修正回CST中国北京时间。
  • logkit grok pattern 其格式符合 %{<捕获语法>[:<字段名>][:<字段类型>]},其中中括号的内容可以省略
    • logkit的grok pattern是logstash grok pattern的增强版,除了完全兼容logstash grok pattern规则以外,还增加了类型,与telegraf的grok pattern规则一致,但是使用的类型是logkit自身定义的。你可以在logstash grok文档中找到详细的grok介绍.
    • 捕获语法 是一个正则表达式的名字,比如内置了USERNAME [a-zA-Z0-9._-]+,那么此时USERNAME就是一个捕获语法。所以,在使用自定义的正则表达式之前,你需要先为你的正则命名,然后把这个名字当作捕获语法填写patterns中,当然,不推荐自己写正则,建议首选内置的捕获语法。
    • 字段名 按照捕获语法对应的正则表达式解析出的字段,其字段名称以此命名,该项可以不填,但是没有字段名的grok pattern不解析,无法被logkit sender使用,但可以作为一个中间捕获语法与别的捕获语法共同组合一个新的捕获语法
    • 字段类型 可以不填,默认为string。logkit支持以下类型。
      • string 默认的类型
      • long 整型
      • float 浮点型
      • date 时间类型,包括以下格式 - 2006/01/02 15:04:05,
        • 2006-01-02 15:04:05 -0700 MST,
        • 2006-01-02 15:04:05 -0700,
        • 2006-01-02 15:04:05,
        • 2006/01/02 15:04:05 -0700 MST,
        • 2006/01/02 15:04:05 -0700,
        • 2006-01-02 -0700 MST,
        • 2006-01-02 -0700,
        • 2006-01-02,
        • 2006/01/02 -0700 MST,
        • 2006/01/02 -0700,
        • 2006/01/02,
        • Mon Jan _2 15:04:05 2006 ANSIC,
        • Mon Jan _2 15:04:05 MST 2006 UnixDate,
        • Mon Jan 02 15:04:05 -0700 2006 RubyDate,
        • 02 Jan 06 15:04 MST RFC822,
        • 02 Jan 06 15:04 -0700 RFC822Z,
        • Monday, 02-Jan-06 15:04:05 MST RFC850,
        • Mon, 02 Jan 2006 15:04:05 MST RFC1123,
        • Mon, 02 Jan 2006 15:04:05 -0700 RFC1123Z,
        • 2006-01-02T15:04:05Z07:00 RFC3339,
        • 2006-01-02T15:04:05.999999999Z07:00 RFC3339Nano,
        • 3:04PM Kitchen,
        • Jan _2 15:04:05 Stamp,
        • Jan _2 15:04:05.000 StampMilli,
        • Jan _2 15:04:05.000000 StampMicro,
        • Jan _2 15:04:05.000000000 StampNano,
      • drop 表示扔掉该字段
    • 验证自定义pattern的正确性http://grokdebug.herokuapp.com, 这个网站可以debug你的grok pattern

grokdebug用法

  1. 访问网址: http://grokdebug.herokuapp.com
  2. 如下图所示,填写各类信息:

一条示例日志:

[04/Jun/2016:12:41:45 +0100] 1.25 200 192.168.1.1 5.432µs 101

最终使用的grok pattern

%{TEST_LOG_A}

基础的grok pattern构成

# Test A log line:
#   [04/Jun/2016:12:41:45 +0100] 1.25 200 192.168.1.1 5.432µs 101
DURATION %{NUMBER}[nuµm]?s
RESPONSE_CODE %{NUMBER:response_code}
RESPONSE_TIME %{DURATION:response_time}
TEST_LOG_A \[%{HTTPDATE:timestamp:date}\] %{NUMBER:myfloat:float} %{RESPONSE_CODE} %{IPORHOST:clientip} %{RESPONSE_TIME} %{NUMBER:myint:long}

# Test B log line:
#   [04/06/2016--12:41:45] 1.25 mystring dropme nomodifier
TEST_TIMESTAMP %{MONTHDAY}/%{MONTHNUM}/%{YEAR}--%{TIME}
TEST_LOG_B \[%{TEST_TIMESTAMP:timestamp:date}\] %{NUMBER:myfloat:float} %{WORD:mystring:string} %{WORD:dropme:drop} %{WORD:nomodifier}

将grok pattern debug调试完成后的配置落实到logkit配置中

  1. 基础的grok pattern构成 里面的grok pattern填写到本地文件中,假设存储路径为 /home/user/logkit/grok_pattern
  2. 在 logkit的Runner配置文件中,填写grok parser的 grok_custom_pattern_files 配置项 :"grok_custom_pattern_files":"/home/user/logkit/grok_pattern"
  3. 最终使用的grok pattern 里面的模式串,填写到 grok parser的 grok_patterns配置项:"grok_patterns":"%{TEST_LOG_A}"

根据上述配置,一个完整的grok parser配置如下:

"parser":{
        "name":"nginx_parser",
        "type":"grok",
        "grok_patterns":"%{TEST_LOG_A}",
        "grok_custom_pattern_files":"/home/user/logkit/grok_pattern"
    },
Clone this wiki locally