Regex logstash grok筛选器正则表达式在调试工具中工作,但在实际执行中失败

Regex logstash grok筛选器正则表达式在调试工具中工作,但在实际执行中失败,regex,logstash,grok,Regex,Logstash,Grok,我试图从日志行中提取一个字段,我使用以下命令调试正则表达式: (?<action>(?<=action=).*(?=\&)) 我能得到这样的结果: /event?id=123&action={"power":"on"}&package=1 { "action": [ "{"power":"on"}" ] } 但是,当我将此配置复制到日志存储配置文件时: input { stdin{} } filter { grok {

我试图从日志行中提取一个字段,我使用以下命令调试正则表达式:

(?<action>(?<=action=).*(?=\&))
我能得到这样的结果:

 /event?id=123&action={"power":"on"}&package=1
{
  "action": [
   "{"power":"on"}"
 ]
}
但是,当我将此配置复制到日志存储配置文件时:

input { stdin{} }

filter {
  grok {
    match => { "message" => "(?<action>(?<=action=).*(?=\&))"}
  }
}

output { stdout {
  codec => 'json'
}}
我在cygwin中使用logstash-2.1.1。
知道为什么会发生这种情况吗?

它不能回答您的regexp问题,但是


将查询字符串解析为一个单独的字段,并在其上使用kv{}过滤器。

它不会回答您的regexp问题,但是


将查询字符串解析为单独的字段,并在其上使用kv{}过滤器。

您可能会遇到贪婪点匹配子模式引起的问题。由于您只对
action=
之后直到下一个
&
或字符串结尾的文本字符串感兴趣,因此最好使用一个否定字符类
[^&]

所以,使用

[?&]action=(?<action>[^&]*)
[?&]action=(?[^&]*)

[?&]
&
匹配,并在此处用作边界。

您可能会遇到贪婪点匹配子模式引起的问题。由于您只对
action=
之后直到下一个
&
或字符串结尾的文本字符串感兴趣,因此最好使用一个否定字符类
[^&]

所以,使用

[?&]action=(?<action>[^&]*)
[?&]action=(?[^&]*)

[?&]
&
匹配,并在此处用作边界。

尝试使用
\baction=(?[^&]*)
或甚至
[?&]action=(?[^&]*)
。否定的字符类<代码> [^ & ] 将使它不那么贪婪,并且应该更有效,并且潜在地解决其他问题。谢谢,这工作对我来说是有效的,正如你所说的,使它不那么贪婪,将有助于避免很多问题。如果它对你有帮助的话,请考虑我的回答。尝试使用<代码> \BActuff=(?[^?] *)甚至
[?&]action=(?[^&]*)
。否定的字符类<代码> [^ & ] 将使它不那么贪婪,并且应该更有效,并且潜在地解决其他问题。谢谢,这工作对我来说是有效的,正如你所说的,使它不那么贪婪,将有助于避免很多问题。如果它对你有帮助,请考虑我的回答。谢谢你提供这样的方法。我试图通过%{URIPATH}匹配查询字符串,但结果它无法捕获以“{”开头的字符串。URIPATH中允许使用大括号;双引号不是该模式的一部分。请使用其他模式。感谢您提供这种方法,我尝试通过%{URIPATH}匹配查询字符串但是,它不能捕获字符串,从“{”在URIPATH中允许使用卷曲括号;这是双引号,而不是该模式的一部分。请使用不同的模式。如果它对您有帮助,请考虑我的回答。如果它对您有帮助的话,请考虑我的回答。