我正在使用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创建此映射?
更新:
我现在也解决了这个错误."[logs]的对象映射尝试解析为对象,但是得到了EOF,是否有一个具体的值提供给它?"
正如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" } }
John Petrone.. 14
您需要一个映射来在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
您需要一个映射来在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