【问题标题】:Logstash Add field from grok filterLogstash 从 grok 过滤器添加字段
【发布时间】:2018-12-19 15:20:31
【问题描述】:

是否可以使用 grok 和 mutate 将消息与 logstash 中的新字段匹配?

示例日志:

"<30>Dec 19 11:37:56 7f87c507df2a[20103]: [INFO] 2018-12-19 16:37:56 _internal (MainThread): 192.168.0.6 - - [19/Dec/2018 16:37:56] \"\u001b[37mGET / HTTP/1.1\u001b[0m\" 200 -\r"

我正在尝试创建一个新的键值,我将 container_id 与 7f87c507df2a 匹配。

filter {
  grok {
    match => [ "message", "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:service}|-) +(?:%{NOTSPACE:containerName}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" ]
  }
  mutate {
    add_field => { "container_id" => "%{containerName}"}
  }
}

生成的日志文件呈现了这个,其中 containerName 的值没有从 grok 中引用,它只是一个字符串文字:

"container_id": "%{containerName}" 

我正在尝试创建 conf:

"container_id": "7f87c507df2a"

显然 containerName 的值没有从 grok 链接。我想做的甚至可能吗?

【问题讨论】:

  • 我不确定我是否理解这个问题,但如果是这样,一个简单的filter { mutate { copy =&gt; { "containerName" =&gt; "container_id" } } } 应该可以完成这项工作
  • 您可以尝试的另一件事是将add_field =&gt; { "container_id" =&gt; "%{containerName}"} 直接添加到grok 部分 - 但如果“containerName”在 grok 模式中不匹配,则键/值对不会添加到结果中。
  • @Quali 都没有工作,有没有更简单的方法来测试我的 grok 匹配是否正常工作?但是,logstash 的日志中似乎没有错误。我用示例日志文件和我正在尝试做的事情更新了帖子
  • 您的模式似乎与示例日志不匹配。

标签: logstash logstash-grok logstash-configuration


【解决方案1】:

正如 cmets 中所解释的,我的 grok 模式不正确。对于任何可能徘徊在这篇文章中需要 grok 帮助的人,请转到 here 以减少构建模式的时间。

这是工作快照:

filter {
  grok {
    match => [ "message", "\A%{SYSLOG5424PRI}%{SYSLOGTIMESTAMP}%{SPACE}%{BASE16NUM:docker_id}%{SYSLOG5424SD}%{GREEDYDATA:python_log_message}" ]
    add_field => { "container_id" => "%{docker_id}" }    
  }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多