Logstash,如何使用来自事件数据的grok模式

时间:2018-01-11 16:14:28

标签: kubernetes logstash elastic-stack logstash-grok

我在kubernetes上部署了一个用于收集容器数据的ELK堆栈。在所有其余的中,它使用grok过滤器根据模式解析实际的日志行。

我希望能够通过在kubernetes pod中使用注释来设置此模式。

我在elk-grok-pattern中添加了一个名为pod的注释,配置了filebeat以转发注释,我可以将注释值作为event中的字段在logstash,到目前为止一直很好。

问题是我无法将我的字段值用作grok pattern

我的pod中的注释如下所示:

Annotations:    elk-grok-pattern=%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:status} %{NUMBER:response_time}

我尝试使用的filter类似于以下内容:

filter {
  # create a new field called "elk-grok-pattern" from the pod annotation
  mutate {
        rename => { "[kubernetes][annotations][elk-grok-pattern]" => "elk-grok-pattern" }
  }

  grok {
    pattern_definitions => {
      "CUSTOM" => "%{elk-grok-pattern}"
    }
    match => { "log" => "%{CUSTOM}" }
  }
}

不幸的是,这会导致错误:

Pipeline aborted due to error {:pipeline_id=>"main", :exception=>#<Grok::PatternError: pattern %{elk-grok-pattern} not defined>

在实践中,grok正在逐字地解释我的模式,而不是评估来自事件的字符串内容。

我也尝试直接使用模式,定义了一个pattern_definition,如下所示:

grok {
  match => { "log" => "%{elk-grok-pattern}" }
}

但我得到了同样的错误。

有没有办法实现我的目标? 任何建议或可能的解决方法都将非常感激。

1 个答案:

答案 0 :(得分:0)

如果你不想在其他地方使用这种模式,为什么不在这样的比赛中使用呢?

grok {
  match => { "log" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:status} %{NUMBER:response_time}" }
}

如果您想稍后在其他过滤器中使用它,请查看有关模式创建的页面:
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#setting_patterns_dir