【问题标题】:Can I write a grok on a field which is result of previous grok pattern我可以在以前的 grok 模式的结果的字段上写一个 grok
【发布时间】:2023-03-19 21:40:01
【问题描述】:

我编写了一个 grok 模式来将一大块消息放入一个字段中。现在我想用不同的 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",

现在如果我想写另一个 grok 来从 Info 字段中提取数据。我怎样才能做到这一点。 谢谢。

【问题讨论】:

  • 有什么特别的理由不解析第一个 grok 中的所有内容吗?无论如何,添加另一个匹配“信息”字段的 grok 过滤器应该没问题
  • 谢谢@glenacota。 Info 字段中的信息很大,并且因结果而异。因此,整个消息的单一 grok 并没有真正起作用。当您说为字段编写 grok 应该没问题时。我怎样才能做到这一点。
  • 我试着把另一个 grok 像下面这样: match => { "Info" => "((.|\r|\n)*)Active: %{GREEDYDATA:Active}\s*用户:\s*%{USER:UserInfo}" }。这只是样品grok。但它不处理 Info 字段数据。

标签: logstash elastic-stack logstash-grok


【解决方案1】:

如果您想使用第二个 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 } } }

结果

  "ThreadNo" => "1686439616",
   "tNumber" => "3",
  "UserInfo" => "s-plmv6intp",
    "Active" => "1 minute  49.00 seconds   "

等等

【讨论】:

  • 您好@Badger,您的方法在示例日志中运行良好,但在我的实际日志中,它让我执行 grok 超时。 针对字段“信息”,其值为“值太大而无法输出(1098 字节)!前 255 个字符是:
  • 回溯过多会导致超时。尝试简化模式。例如,“Info”=>“Active: %{DATA:Active}\s*User:\s*%{USER:UserInfo}”是否有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多