【发布时间】:2014-07-24 02:41:07
【问题描述】:
我正在使用 logstash 将日志提供给 ElasticSearch。 我将logstash输出配置为:
input {
file {
path => "/tmp/foo.log"
codec =>
plain {
format => "%{message}"
}
}
}
output {
elasticsearch {
#host => localhost
codec => json {}
manage_template => false
index => "4glogs"
}
}
我注意到,一旦我启动 logstash,它就会在 ES 中创建一个映射 (logs),如下所示。
{
"4glogs": {
"mappings": {
"logs": {
"properties": {
"@timestamp": {
"type": "date",
"format": "dateOptionalTime"
},
"@version": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
}
}
}
如何防止 logstash 创建此映射?
更新:
我现在也解决了这个错误。 “[logs] 的对象映射尝试解析为对象,但得到了 EOF,是否为其提供了具体值?”
正如 John Petrone 下面所说,一旦定义了映射,您必须确保您的文档符合映射。在我的例子中,我定义了一个“type:nested”的映射,但是logstash的输出是一个字符串。 因此,我从我的 logstash 配置中删除了所有编解码器(无论是 json 还是 plain),这使得 json 文档可以通过而无需更改。
这是我的新 logstash 配置(带有一些额外的多行日志过滤器)。
input {
kafka {
zk_connect => "localhost:2181"
group_id => "logstash_group"
topic_id => "platform-logger"
reset_beginning => false
consumer_threads => 1
queue_size => 2000
consumer_id => "logstash-1"
fetch_message_max_bytes => 1048576
}
file {
path => "/tmp/foo.log"
}
}
filter {
multiline {
pattern => "^\s"
what => "previous"
}
multiline {
pattern => "[0-9]+$"
what => "previous"
}
multiline {
pattern => "^$"
what => "previous"
}
mutate{
remove_field => ["kafka"]
remove_field => ["@version"]
remove_field => ["@timestamp"]
remove_tag => ["multiline"]
}
}
output {
elasticsearch {
manage_template => false
index => "4glogs"
}
}
【问题讨论】:
-
是在第一条消息到达时创建还是在日志存储开始时创建?
-
仔细观察,似乎是第一条消息到达的时候。
-
好吧,你不能改变它,这就是elasticsearch所做的。它需要一个映射,如果它不可用,它会自动创建一个。你想完成什么?
-
Jettro,感谢您的回复。我不希望在第一条消息上发生动态映射。因此,似乎定义我自己的映射(严格)是一种方式。但是我自己的映射仍然存在问题。请参阅下面的“对象映射错误”。