如何阻止logstash在ElasticSearch中创建默认映射

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

我使用logstash将日志输入ElasticSearch。我将logstash输出配置为:

input {
file {
            path => "/tmp/foo.log"
            codec =>
                    plain {
                    format => "%{message}"
            }
    }
}
output {
        elasticsearch {
                        #host => localhost 
                        codec => json {}
                        manage_template => false
                        index => "4glogs"
                }
}

我注意到,一旦我开始日志存储,它就会在ES中创建一个映射(日志),如下所示。

{
    "4glogs": {
        "mappings": {
            "logs": {
                "properties": {
                    "@timestamp": {
                        "type": "date",
                        "format": "dateOptionalTime"
                    },
                    "@version": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    }
                }
            }
        }
    }
}

如何防止logstash创建此映射?

最新情况:

我现在也解决了这个错误。“对象映射原木试着作为对象进行解析,但得到了EOF,是否提供了一个具体的值?“

正如JohnPetrone在下面所述,一旦定义了映射,就必须确保文档符合映射。在我的例子中,我定义了一个“type:nested”的映射,但是logstash的输出是一个字符串。因此,我从logstash配置中删除了所有的代码(不管是json还是平原),这使得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中并在其上进行搜索--这就是ES知道如何索引和搜索这些内容类型的方法。可以让logstash动态地创建它,也可以阻止它这样做,而是手动创建它。

请记住,不能更改现有的映射(尽管您可以添加到它们中)。因此,首先需要删除现有的索引。然后修改设置以防止动态映射创建。同时,创建自己的映射。

例如,这将为logstash数据创建映射,但也会通过“严格”限制任何动态映射创建:

$ curl -XPUT 'http://localhost:9200/4glogs/logs/_mapping' -d '
{
    "logs" : {
        "dynamic": "strict",
        "properties" : {
            "@timestamp": {
                "type": "date",
                "format": "dateOptionalTime"
                    },
            "@version": {
                "type": "string"
                    },
             "message": {
                "type": "string"
                    }
        }
    }
}
'

请记住,索引名“4 GLOGS”和类型“日志”需要匹配来自logstash的内容。

对于我的生产系统,我通常倾向于关闭动态映射,因为它避免了偶然的映射创建。

用户回答回答于

logs在这种情况下,index_type...。如果你不想把它创建成logs,指定其他一些index_type你的elasticsearch元素。ElasticSearch中的每条记录都需要有一个索引和一个类型。Logstash默认为logs如果你没有具体说明的话。

将记录插入Elasticearch时,总是会创建隐式映射,因此不能阻止它被创建。在插入任何内容之前,可以自己创建映射(通过模板映射)。

设置manage_templatefalse只是防止它为index你已经说明了。如果已经创建了现有模板,则可以使用以下方法删除该模板curl -XDELETE http://localhost:9200/_template/logstash?pretty

扫码关注云+社区