Как остановить 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"
}
}
Ответы
Ответ 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. Вы можете создать шаблоны индексов с поддержкой подстановочных знаков для соответствия имени индекса и поместить сопоставления по умолчанию.