logstash 中的数据模式 - grok

DATA pattern in logstash - grok

我想了解 logstash 的 grok 插件中的 DATA 模式。 根据文档 DATA 匹配如下:

DATA .*? --> I interpreted it as anything with length 1 to n [Please correct me if my understanding is wrong].

在我的脚本中,它无法正确解析我的输入。
Logstash 配置文件:

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 模式的行为。

.*? 零次到无限次匹配,越少越好,按需扩展。它可以匹配 次的事实是您看不到结果的原因。

写出来,有问题的部分是这样的:

,(.*?),(.*?)(添加捕获组以提高可读性)

这匹配:,a,

1.Take第一个,并匹配它。

2.Try 以尽可能少的方式匹配 .*?(逐个字符直到模式有效)这匹配 a

3.Try 匹配下一个 ,。这样就成功了,所以第一个 .*? 就完成了。

4.Try 匹配 .*?。由于这可以匹配 次,因此它会这样做并且匹配完成。


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