web-dev-qa-db-fra.com

Comment empêcher logstash de créer un mappage par défaut dans ElasticSearch

J'utilise logstash pour alimenter les journaux dans ElasticSearch. Je configure la sortie logstash comme:

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

Je remarque que dès que je démarre logstash, il crée un mappage (journaux) dans ES comme ci-dessous.

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

Comment puis-je empêcher logstash de créer ce mappage?

MISE À JOUR:

J'ai maintenant résolu cette erreur également. "le mappage d'objet pour [logs] a essayé d'analyser en tant qu'objet, mais a obtenu EOF, une valeur concrète lui a-t-elle été fournie?"

Comme John Petrone l'a indiqué ci-dessous, une fois que vous avez défini un mappage, vous devez vous assurer que vos documents sont conformes au mappage. Dans mon cas, j'avais défini un mappage de "type: nested" mais la sortie de logstash était une chaîne. J'ai donc supprimé tous les codecs (json ou plain) de ma configuration logstash et cela a permis au document json de passer sans modifications.

Voici ma nouvelle configuration logstash (avec quelques filtres supplémentaires pour les journaux multilignes).

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"
                }
}
19
Prakash Shankor

Vous aurez besoin d'un mappage pour stocker des données dans Elasticsearch et pour les rechercher - c'est ainsi qu'ES sait indexer et rechercher ces types de contenu. Vous pouvez soit laisser logstash le créer dynamiquement, soit l'empêcher de le faire et le créer manuellement.

N'oubliez pas que vous ne pouvez pas modifier les mappages existants (bien que vous puissiez les ajouter). Vous devez donc d'abord supprimer l'index existant. Vous devez ensuite modifier vos paramètres pour empêcher la création de mappage dynamique. En même temps, vous voudrez créer votre propre cartographie.

Par exemple, cela créera les mappages pour les données de logstash mais restreindra également toute création de mappage dynamique via "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"
                    }
        }
    }
}
'

Gardez à l'esprit que le nom d'index "4glogs" et le type "logs" doivent correspondre à ce qui provient de logstash.

Pour mes systèmes de production, je préfère généralement désactiver la cartographie dynamique car cela évite la création de cartographie accidentelle.

Les liens suivants devraient être utiles si vous souhaitez apporter des ajustements à vos mappages dynamiques:

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
John Petrone

logs dans ce cas est le index_type. Si vous ne voulez pas le créer en tant que logs, spécifiez un autre index_type sur votre élément elasticsearch. Chaque enregistrement dans elasticsearch doit avoir un index et un type. Logstash est par défaut logs si vous ne l'avez pas spécifié.

Un mappage implicite est toujours créé lorsque vous insérez des enregistrements dans Elasticsearch, vous ne pouvez donc pas empêcher sa création. Vous pouvez créer le mappage vous-même avant d'insérer quoi que ce soit (par exemple un mappage de modèle).

Le réglage manage_template de false l'empêche simplement de créer le mappage de modèle pour le index que vous avez spécifié. Vous pouvez supprimer le modèle existant s'il a déjà été créé en utilisant quelque chose comme curl -XDELETE http://localhost:9200/_template/logstash?pretty

3
Alcanzar

Les modèles d'index peuvent vous aider. Veuillez voir ceci jira pour plus de détails. Vous pouvez créer des modèles d'index avec prise en charge des caractères génériques pour correspondre à un nom d'index et mettre vos mappages par défaut.

1
Pankaj Yadav