logstash grok 过滤器正则表达式在调试工具中有效但在实际执行中失败
logstash grok filter regular expression works in debug tool but failed in actual execution
我正在尝试从日志行中提取一个文件,我使用 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。
知道为什么会这样吗?
它没有回答您的正则表达式问题,但是...
将查询字符串解析为单独的字段并对其使用 kv{} 过滤器。
您可能会遇到由贪心点匹配子模式引起的问题 .*
。由于您只对 action=
之后到下一个 &
或字符串结尾的文本字符串感兴趣,因此您最好使用否定字符 class [^&]
.
所以,使用
[?&]action=(?<action>[^&]*)
[?&]
匹配 ?
或 &
并在此处用作边界。
我正在尝试从日志行中提取一个文件,我使用 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。 知道为什么会这样吗?
它没有回答您的正则表达式问题,但是...
将查询字符串解析为单独的字段并对其使用 kv{} 过滤器。
您可能会遇到由贪心点匹配子模式引起的问题 .*
。由于您只对 action=
之后到下一个 &
或字符串结尾的文本字符串感兴趣,因此您最好使用否定字符 class [^&]
.
所以,使用
[?&]action=(?<action>[^&]*)
[?&]
匹配 ?
或 &
并在此处用作边界。