我正在尝试理解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
模式的行为。
答案 0 :(得分:1)
.*?
在零和无限次之间匹配,尽可能少,根据需要进行扩展。它可以匹配零次的事实是您没有看到结果的原因。
写出来,有问题的部分看起来像这样:
,(.*?),(.*?)
(为了便于阅读而添加了捕获组)
匹配:,a,
1.取第一个,
并匹配。
2.尝试尽可能少地匹配.*?
(逐个字符,直到模式有效),这与a
3.尝试匹配下一个,
。这样就完成了第一次.*?
。
4.尝试匹配.*?
。由于这可以匹配零次,因此匹配完成。
问题的简单解决方案是在模式的末尾添加$
。 $
是字符串锚点的结尾,因此您的第二个.*?
被强制与另一个a
匹配。