【发布时间】:2018-12-02 05:25:18
【问题描述】:
我在使用 sprintf 引用 elasticsearch 输出插件中的事件字段时遇到问题,我不知道为什么。以下是过滤完成后从 Filebeat 接收并发送到 Elasticsearch 的事件:
{
"beat" => {
"hostname" => "ca86fed16953",
"name" => "ca86fed16953",
"version" => "6.5.1"
},
"@timestamp" => 2018-12-02T05:13:21.879Z,
"host" => {
"name" => "ca86fed16953"
},
"tags" => [
[0] "beats_input_codec_plain_applied",
[1] "_grokparsefailure"
],
"fields" => {
"env" => "DEV"
},
"source" => "/usr/share/filebeat/dockerlogs/logstash_DEV.log",
"@version" => "1",
"prospector" => {
"type" => "log"
},
"bgp_id" => "42313900",
"message" => "{<some message here>}",
"offset" => 1440990627,
"input" => {
"type" => "log"
},
"docker" => {
"container" => {
"id" => "logstash_DEV.log"
}
}
}
我正在尝试根据 filebeat 的环境来索引文件。这是我的配置文件:
input {
http { }
beats {
port => 5044
}
}
filter {
grok {
patterns_dir => ["/usr/share/logstash/pipeline/patterns"]
break_on_match => false
match => { "message" => ["%{RUBY_LOGGER}"]
}
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "%{[fields][env]}-%{+yyyy.MM.dd}"
}
stdout { codec => rubydebug }
}
我认为引用的事件字段在到达 elasticsearch 输出插件时已经被填充。但是,在 kibana 端,它没有注册格式化索引。相反,它是这样的:
我做错了什么?
【问题讨论】:
-
我无法使用行编解码器的格式选项重现您的问题,并且由于我没有安装 ES,因此我无法尝试使用 elasticsearch 输出重现它。但是您可以尝试使用 mutate#copy 过滤器选项将值移动到另一个字段,对于可以使用
%{field_name}直接访问而没有[或]的字段,它可能会起作用。 -
@baudsp 感谢您的建议!我意识到,默认情况下,如果使用除 logstash-%{+YYYY.MM.dd} 之外的不同索引名称,elasticsearch 会要求您指定自定义模板。要禁用,我们需要包含 manage_templates => false 键。发布了这个答案
-
我完全忘记了那个选项。或者从来不知道它会这样做。恭喜!
标签: indexing logstash elastic-stack elasticsearch-plugin logstash-configuration