Grok Pattern在Logstash

时间:2016-06-22 22:02:17

标签: logstash logstash-grok

解析日志后,我发现消息末尾有一些新行

示例消息

  

ts:2016-04-26 05-02-16-018   CDT | LL:TRACE | TID:10000.140 | SCF:xxxxxxxxxxxxxxxxxxxxxxxxxxx.pc | MN:空| FN:xxxxxxxxxxxxxxxxxxxxxxxxxxx | LN:749 | AUID:xxxxxxxxxxxxxxxxxxxxxxxxxxx | EID:xxx.xxx.xxx.xxx-58261618-1-1461664935955-139 | CID:900009865 |毫升:空|中期:-99 | UIP:xxx.xxx.xxx.xxx |臀部:xxx.xxx.xxx.xxx | PLI:空|信息:   xxxxxxxxxxxxxxxxxxxxxxxxxxx | pl:xxxxxxxxxxxxxxxxxxxxxxxxxxx

     

TAKE 1 xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx   xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx

我正在使用下面的正则表达式模式作为答案

ts:(?(([0-9] +) - )+([0-9] + - )+ [AZ] +)\ | ll:%{WORD:ll } \ | TID:%{NUMBER:TID} \ | SCF:%{DATA:SCF} \ | MN:%{WORD:MN} \ | FN:%{WORD:FN} \ | LN:%{WORD:LN } \ | AUID:%{WORD:AUID} \ | EID:%{DATA:EID} \ | CID:%{WORD:CID} \ |毫升:%{WORD:毫升} \ |中期:%{NUMBER:中间} \ | UIP:%{DATA:UIP} \ |髋:%{DATA:髋} \ | PLI:%{WORD:PLI} \ | \ S MSG:%{GREEDYDATA:MSG}(\ | PL :)

((| | \ r \ n)的?)。

但遗憾的是,当日志的最后一部分不存在时,它无法正常工作

  

ts:2016-04-26 05-02-16-018   CDT | LL:TRACE | TID:10000.140 | SCF:xxxxxxxxxxxxxxxxxxxxxxxxxxx.pc | MN:空| FN:xxxxxxxxxxxxxxxxxxxxxxxxxxx | LN:749 | AUID:xxxxxxxxxxxxxxxxxxxxxxxxxxx | EID:xxx.xxx.xxx.xxx-58261618-1-1461664935955-139 | CID:900009865 |毫升:空|中期:-99 | UIP:xxx.xxx.xxx.xxx |髋:xxx.xxx.xxx.xxx

正确的模式应该是什么?

-------------------上一个问题-------------------------- ------------

我正在尝试解析这个日志行。

ts:2016-04-26 05-02-16-018 CDT | ll:TRACE | tid:10000.140 | scf:xxxxxxxxxxxxxxxxxxxxxxxxxxx.pc | mn:null | fn:xxxxxxxxxxxxxxxxxxxxxxxxxxx | ln:749 | auid:xxxxxxxxxxxxxxxxxxxxxxxxxxx | eid :xxx.xxx.xxx.xxx-58261618-1-1461664935955-139 | CID:900009865 |毫升:空|中期:-99 | UIP:xxx.xxx.xxx.xxx |臀部:xxx.xxx.xxx.xxx | pli:null | msg:xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx

以下是我的logstash过滤器

filter {
    grok {
        match => ["mesage", "ts:(?<date>(([0-9]+)-*)+ ([0-9]+-*)+ [A-Z]+)\|ll:%{WORD:ll}\|tid:%{WORD:tid}\|scf:%{WORD:scf}\|mn:%{WORD:mn}\|fn:%{WORD:fn}\|ln:%{WORD:ln}\|auid:%{WORD:auid}\|eid:%{WORD:eid}\|cid:%{WORD:cid}\|ml:%{WORD:ml}\|mid:%{WORD:mid}\|uip:%{WORD:uip}\|hip:%{WORD:hip}\|pli:%{WORD:pli}\|msg:%{WORD:msg}"]
    }
    date {
        match => ["ts","yyyy-MM-dd HH-mm-ss-SSS ZZZ"]
        target => "@timestamp"
    }
}

我得到了“_grokparsefailure”

2 个答案:

答案 0 :(得分:1)

我已经测试了@HAL的配置,有一些事情需要改变:

  • 在grok过滤器中mesage =&gt; message
  • 在日期过滤器中ts =&gt; date所以日期解析位于右侧字段
  • CDT是时区名称,在日期语法中由z捕获。

所以正确的配置如下所示:

filter{
    grok {
        match => ["message", "ts:(?<date>(([0-9]+)-*)+ ([0-9]+-*)+ [A-Z]+)\|ll:%{WORD:ll}\|tid:%{NUMBER:tid}\|scf:%{DATA:scf}\|mn:%{WORD:mn}\|fn:%{WORD:fn}\|ln:%{WORD:ln}\|auid:%{WORD:auid}\|eid:%{DATA:eid}\|cid:%{WORD:cid}\|ml:%{WORD:ml}\|mid:%{NUMBER:mid}\|uip:%{DATA:uip}\|hip:%{DATA:hip}\|pli:%{WORD:pli}\|\s*msg:%{GREEDYDATA:msg}"]
    }
    date {
        match => ["date","yyyy-MM-dd HH-mm-ss-SSS z"]
        target => "@timestamp"
    }
}

答案 1 :(得分:0)

尝试通过grokdebug用你的表达式解析你的输入,但它没有读出任何字段。通过将表达式更改为:

来管理以使其工作
ts:(?<date>(([0-9]+)-*)+ ([0-9]+-*)+ [A-Z]+)\|ll:%{WORD:ll}\|tid:%{NUMBER:tid}\|scf:%{DATA:scf}\|mn:%{WORD:mn}\|fn:%{WORD:fn}\|ln:%{WORD:ln}\|auid:%{WORD:auid}\|eid:%{DATA:eid}\|cid:%{WORD:cid}\|ml:%{WORD:ml}\|mid:%{NUMBER:mid}\|uip:%{DATA:uip}\|hip:%{DATA:hip}\|pli:%{WORD:pli}\|\s*msg:%{GREEDYDATA:msg}

我还认为您需要更改logstash应从mesage解析为message的列的名称。

此外,日期解析模式应与输入中的日期格式匹配。输入数据中没有时区标识(ZZZ)(至少在示例中没有)。

这样的事情应该更好(虽然没经过测试):

filter {
    grok {
        match => ["mesage", "ts:(?<date>(([0-9]+)-*)+ ([0-9]+-*)+ [A-Z]+)\|ll:%{WORD:ll}\|tid:%{NUMBER:tid}\|scf:%{DATA:scf}\|mn:%{WORD:mn}\|fn:%{WORD:fn}\|ln:%{WORD:ln}\|auid:%{WORD:auid}\|eid:%{DATA:eid}\|cid:%{WORD:cid}\|ml:%{WORD:ml}\|mid:%{NUMBER:mid}\|uip:%{DATA:uip}\|hip:%{DATA:hip}\|pli:%{WORD:pli}\|\s*msg:%{GREEDYDATA:msg}"]
    }
    date {
        match => ["ts","yyyy-MM-dd HH-mm-ss-SSS"]
        target => "@timestamp"
    }

}