在logstash中的数据模式 - grok

时间:2017-01-09 12:45:28

标签: logstash logstash-grok

我正在尝试理解logstash的grok插件中的DATA模式。 根据文档DATA匹配如下:

  

DATA .*? - >我把它解释为长度为1到n的任何东西[请   如果我的理解是错误的,请纠正我。]

在我的脚本中,它无法正确解析我的输入 Logstash conf:

input{
file {
        path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"]
        start_position => beginning
        sincedb_path => "/home/osboxes/logstash_conf/mydir/.sincedb"
   }
}
filter{
        grok {
                match => { "message" => "^%{TIMESTAMP_ISO8601:timeStamp},%{DATA:ID},%{DATA:somedata}" }
        }
}
output {
   stdout {
        codec => json_lines
   }
} 

输入:

2017-01-09 02:00:03.887,a,a 

输出

{
    "message": "2017-01-09 02:00:03.887,a,a",
    "@version": "1",
    "@timestamp": "2017-01-09T12:28:20.958Z",
    "path": "/home/osboxes/logstash_conf/mydir/test_logs/data",
    "host": "osboxes",
    "timeStamp": "2017-01-09 02:00:03.887",
    "ID": "a"
}

我希望标记somedata将填充值[就像它对标记ID所做的那样],但它会从输出中省略。任何人都可以帮助我理解DATA模式的行为。

1 个答案:

答案 0 :(得分:1)

.*?在零和无限次之间匹配,尽可能少,根据需要进行扩展。它可以匹配次的事实是您没有看到结果的原因。

写出来,有问题的部分看起来像这样:

,(.*?),(.*?)(为了便于阅读而添加了捕获组)

匹配:,a,

1.取第一个,并匹配。

2.尝试尽可能少地匹配.*?(逐个字符,直到模式有效),这与a

匹配

3.尝试匹配下一个,。这样就完成了第一次.*?

4.尝试匹配.*?。由于这可以匹配次,因此匹配完成。

问题的简单解决方案是在模式的末尾添加$$是字符串锚点的结尾,因此您的第二个.*?被强制与另一个a匹配。