我正在尝试从日志行中提取一个文件,我使用http://grokdebug.herokuapp.com/使用调试我的正则表达式
(?<action>(?<=action=).*(?=&))
输入文本如下:
/event?id=123&action={"power":"on"}&package=1
我得到了这样的结果:
{
"action": [
"{"power":"on"}"
]
}
但是当我把这个配置复制到我的logstash配置文件时:
input { stdin{} }
filter {
grok {
match => { "message" => "(?<action>(?<=action=).*(?=&))"}
}
}
output { stdout {
codec => 'json'
}}
输出显示匹配失败:
{"message":" /event?id=123&action={"power":"on"}&package=1","@version":"1","@timestamp":"2016-01-05T10:30:04.714Z","host":"xxx","tags":["_grokparsefailure"]}
我在cygwin中使用logstash-2.1.1。知道为什么会发生这种事吗?
您可能会遇到由贪婪点匹配子模式.*
引起的问题。由于您只对action=
之后直到下一个&
或字符串末尾的文本字符串感兴趣,因此最好使用否定字符类[^&]
。
所以,使用
[?&]action=(?<action>[^&]*)
[?&]
与?
或&
匹配,并且在这里用作边界。
它不会回答您的regexp问题,但。。。
将查询字符串解析为一个单独的字段,并对其使用kv{}筛选器。