我在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}" }
}
但我得到了同样的错误。
有没有办法实现我的目标? 任何建议或可能的解决方法都将非常感激。
答案 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