首页 文章

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

提问于
浏览
19

我正在使用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中创建一个映射(日志),如下所示 .

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

如何防止logstash创建此映射?

UPDATE:

我现在也解决了这个错误 . "object mapping for [logs] tried to parse as object, but got EOF, has a concrete value been provided to it?"

正如John Petrone在下面所述,一旦定义了映射,就必须确保您的文档符合映射 . 在我的例子中,我已经定义了“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"
                }
}

3 回答

  • 3

    您需要一个映射来在Elasticsearch中存储数据并对其进行搜索 - 这就是ES知道如何索引和搜索这些内容类型的方式 . 您可以让logstash动态创建它,也可以阻止它这样做,而是手动创建它 .

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

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

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

    请记住,索引名称“4glogs”和类型“logs”需要匹配来自logstash的内容 .

    对于我的 生产环境 系统,我通常更喜欢关闭动态映射,因为它避免了意外的映射创建 .

    如果要对动态映射进行调整,以下链接应该非常有用:

    https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html

    http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-dynamic-mapping.html

    http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/dynamic-mapping.html

  • 14

    logs 在这种情况下是 index_type . 如果您不想将其创建为 logs ,请在 elasticsearch 元素上指定其他 index_type . elasticsearch中的每条记录都需要具有索引和类型 . 如果您尚未指定,则Logstash默认为 logs .

    将记录插入Elasticsearch时,始终会创建隐式映射,因此无法阻止创建它 . 您可以在插入任何内容之前自己创建映射(通过模板映射) .

    false 的设置 manage_template 只是阻止它通过使用类似 curl -XDELETE http://localhost:9200/_template/logstash?pretty 之类的东西创建 index 你've specified. You can delete the existing template if it'的模板映射

  • 1

    索引模板可以帮助您 . 有关详细信息,请参阅jira . 您可以使用通配符支持创建索引模板以匹配索引名称并设置默认映射 .

相关问题