Logstash 我可以在前一个grok模式的结果字段上写一个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
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 "