Logstash 我可以在前一个grok模式的结果字段上写一个grok吗

Logstash 我可以在前一个grok模式的结果字段上写一个grok吗,logstash,elastic-stack,logstash-grok,Logstash,Elastic Stack,Logstash Grok,我编写了一个grok模式,将一大块消息放到一个字段中。现在我想用不同的方法从这个字段中提取数据 First Grok: grok { match => { "message" => "%{WORD:ThreadNo}: %{NOTSPACE:tNumber}, %{GREEDYDATA:Info}" } } 在信息字段中,我捕获了一个原始数据,即 "tNumber" => "t@-1

我编写了一个grok模式,将一大块消息放到一个字段中。现在我想用不同的方法从这个字段中提取数据

First Grok:
grok {
    match => { "message" => "%{WORD:ThreadNo}: %{NOTSPACE:tNumber}, %{GREEDYDATA:Info}" }
    }
在信息字段中,我捕获了一个原始数据,即

    "tNumber" => "t@-1686439616",
    "ThreadNo" => "3",
        "Info" => "<Start Stack Trace>  <1 - ADK Verbose Trace Entry>  stateless dispatch for invokeClass.bosInterface executing  Active: 1 minute  49.00 seconds   User:    s-plmv6intp  Tenant:      Session:    2FF1BFBFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)  Parameters:    bosContext _cntx:      user:        User Agent      depth:        2      session id:        2FF1BFBFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)    bosStringList _params:      2 entries          $$MXRIP$$java.util.HashMap          6    uint8 _local:      1",
“tNumber”=>“t@-1686439616”,
“ThreadNo”=>“3”,
“Info”=>“invokeClass.bosInterface执行活动的无状态调度:1分49秒用户:s-plmv6intp租户:会话:2FF1BFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)参数:bosContext_cntx:user:user-Agent-depth:2会话id:2FF1BFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)bosStringList_参数:2个条目$$MXRIP$$java.util.HashMap 6 uint8(本地:1“,
现在,如果我想写另一篇文章,从Info字段中提取数据。我怎样才能做到这一点。
谢谢。

如果您想使用第二个grok,请使用第二个grok过滤器。不要试图在一个grok筛选器中进行两个匹配。理论上它是被支持的,但很容易出错。下面的配置

input { generator { count => 1 lines => [ 't@-1686439616: 3, <Start Stack Trace>  <1 - ADK Verbose Trace Entry>  stateless dispatch for invokeClass.bosInterface executing  Active: 1 minute  49.00 seconds   User:    s-plmv6intp  Tenant:      Session:    2FF1BFBFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)  Parameters:    bosContext _cntx:      user:        User Agent      depth:        2      session id:        2FF1BFBFCC010E7815678741BB95907F:mx115420087975768b5:(WebServiceFacade.java:84)    bosStringList _params:      2 entries          $$MXRIP$$java.util.HashMap          6    uint8 _local:      1' ] } }
filter {
    grok { match => { "message" => "%{WORD:ThreadNo}: %{NOTSPACE:tNumber}, %{GREEDYDATA:Info}" } }
    grok { match => { "Info" => "((.|\r|\n)*)Active: %{GREEDYDATA:Active}\s*User:\s*%{USER:UserInfo}" } }
}
output  { stdout { codec => rubydebug { metadata => false } } }

等等。

是否有特别的理由不在第一次尝试中解析所有内容?无论如何,你可以添加另一个与“Info”字段匹配的grok过滤器。谢谢@glenacota。信息字段中的信息非常大,并且根据不同的结果而变化。所以,对整个消息进行单次搜索并不能真正起作用。当你说写一篇关于这个领域的文章应该没问题。我如何做到这一点。我尝试了下面的另一种方法:match=>{“Info”=>“((.|\r |\n)*)Active:%{greedydydata:Active}\s*用户:\s*{User:UserInfo}}}。这只是个样品。但是它并没有处理信息字段数据。Hello@Badger,您的方法在示例日志中运行良好,但在我的实际日志中,它给我超时执行grok。针对值为“value”的字段“Info”太大,无法输出(1098字节)!前255个字符是:如果回溯太多,将发生超时。尽量简化模式。例如,“Info”=>“Active:%{DATA:Active}\s*用户:\s*%{User:UserInfo}”是否有效?
  "ThreadNo" => "1686439616",
   "tNumber" => "3",
  "UserInfo" => "s-plmv6intp",
    "Active" => "1 minute  49.00 seconds   "