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でマッピング(logs)が作成されます。
{
"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またはplain)を削除しました。これにより、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"
}
}
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
この場合のlogs
はindex_type
。 logs
として作成したくない場合は、他のindex_type
elasticsearch
要素。 elasticsearchのすべてのレコードには、インデックスとタイプが必要です。 Logstashは、指定しない場合、デフォルトでlogs
になります。
レコードをElasticsearchに挿入すると、常に暗黙的なマッピングが作成されるため、作成を防ぐことはできません。何かを挿入する前に(テンプレートマッピングを介して)自分でマッピングを作成できます。
設定 manage_template
of false
は、指定したindex
のテンプレートマッピングを作成しないようにします。既存のテンプレートが既に作成されている場合は、curl -XDELETE http://localhost:9200/_template/logstash?pretty
インデックステンプレートが役立ちます。詳細はこちらをご覧ください jira ワイルドカードをサポートするインデックステンプレートを作成して、インデックス名と一致させ、デフォルトのマッピングを配置できます。