如何使用 grok 模式在日志消息中找到带有特定单词的引号字符串

How do you find a quoted string with specific word in a log message using grok pattern

我的服务器有一条日志消息,格式如下:

{"host":"a.b.com","source_type":"ABCD"}

到目前为止我有这个 grok 模式,但它接受双引号中的任何单词。

\A%{QUOTEDSTRING}:%{PROG}

如何更改仅检查“主机”的“QUOTEDSTRING”? “host”并不总是在消息的开头,也可以在消息的中间找到。

感谢您的帮助。

由于问题指定“host”可以在日志中的任何位置,您可以使用以下内容:

\{(\"%{GREEDYDATA:data_before}\",)?(\"host\":\"%{DATA:host_value}\")?(,\"%{GREEDYDATA:data_after}\")?\}

解释:

  1. data_before 存储找到主机类型条目之前的可选数据。您可以根据需要将其分开
  2. host :这存储主机值
  3. data_after 存储找到主机类型条目后的可选数据。你可以根据你的需要将它分开

示例:

  1. {"host":"a.b.com","source_type":"ABCD"}

输出:

{
  "data_before": [
    [
      null
    ]
  ],
  "host_value": [
    [
      "a.b.com"
    ]
  ],
  "data_after": [
    [
      "source_type":"ABCD"
    ]
  ]
}
  1. {"host":"a.b.com"}

输出:

{
  "data_before": [
    [
      null
    ]
  ],
  "host_value": [
    [
      "a.b.com"
    ]
  ],
  "data_after": [
    [
      null
    ]
  ]
}
  1. {"source_type":"ABCD","host":"a.b.com","data_type":"ABCD"}

输出:

{
  "data_before": [
    [
      "source_type":"ABCD"
    ]
  ],
  "host_value": [
    [
      "a.b.com"
    ]
  ],
  "data_after": [
    [
      "data_type":"ABCD"
    ]
  ]
}

提示:使用以下资源来调整和测试您的日志记录模式: