Подтвердить что ты не робот

Как остановить logstash от создания сопоставления по умолчанию в ElasticSearch

Я использую 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:

Я тоже исправил эту ошибку. "сопоставление объектов для [журналов] пыталось разобрать как объект, но получил EOF, есть конкретное значение, предоставленное ему?"

Как пояснил Джон Петреон ниже, как только вы определяете сопоставление, вы должны убедиться, что ваши документы соответствуют отображению. В моем случае я определил отображение типа "type: nested", но вывод из logstash был строкой. Поэтому я удалил все кодеки (будь то json или plain) из моей конфигурации logstash и позволил 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"
                }
}
4b9b3361

Ответ 1

Вам понадобится сопоставление для хранения данных в Elasticsearch и поиск по нему - то, как ES знает, как индексировать и искать эти типы контента. Вы можете либо позволить 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"
                    }
        }
    }
}
'

Имейте в виду, что имя индекса "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

Ответ 2

logs в этом случае есть index_type. Если вы не хотите создавать его как logs, укажите еще один index_type в элементе elasticsearch. Каждая запись в elasticsearch должна иметь индекс и тип. Logstash по умолчанию имеет значение logs, если вы его не указали.

Всегда существует неявное отображение, созданное при вставке записей в Elasticsearch, поэтому вы не можете предотвратить его создание. Вы можете создать сопоставление самостоятельно, прежде чем вставлять что-либо (например, с помощью сопоставления шаблонов).

Параметр manage_template false просто мешает ему создать сопоставление шаблонов для указанного вами index. Вы можете удалить существующий шаблон, если он уже создан, используя что-то вроде curl -XDELETE http://localhost:9200/_template/logstash?pretty

Ответ 3

Шаблоны индексов могут вам помочь. Подробнее см. jira. Вы можете создать шаблоны индексов с поддержкой подстановочных знаков для соответствия имени индекса и поместить сопоставления по умолчанию.