【Elasticsearch】エラー failed to parse field [host] of type [text]

お世話になります。

現在Filebeat→Logstash→Elasticsearch(ingest node)の連携を行っています。

バージョン
Filebeat:7.3
Logstash:7.3
Elasticsearch:7.3

Filebeatのinputログ
1286536308.779 180 192.168.0.224 TCP_MISS/200 411 GET http://liveupdate.symantecliveupdate.com/minitri.flg - DIRECT/125.23.216.203 text/plain

Logstashのconfig(filter句は空)

input {
  beats {
   port => XXXX
  }
}

filter {
   }

output{
   elasticsearch{
   hosts => [ "XX.XXX.XXX.XXX:XXXX" ]
   user => "XXXXX"
   password => "XXXX"
   pipeline => "squid_access"
   index => "squid_access"
   }
}

Elasticsearchのingest node

GET /_ingest/pipeline/squid_access

{
  "squid_access" : {
    "processors" : [
      {
        "grok" : {
          "field" : "message",
          "patterns" : [
            "%{NUMBER:timestamp}%{SPACE}%{NUMBER:duration} %{IP:client_address} %{WORD:cache_result}/%{POSINT:status_code} %{NUMBER:bytes} %{WORD:request_method} %{NOTSPACE:url} %{NOTSPACE:user} %{WORD:hierarchy_code}/%{NOTSPACE:server} %{NOTSPACE:content_type}"
          ]
        }
      }
    ]
  }
}

連携すると、Elasticsearchにてエラーが発生します。

Elasticsearch log
org.elasticsearch.index.mapper.MapperParsingException: failed to parse field [host] of type [text] in document with id '-XXXXXX'. Preview of field's value: '{hostname=XXXXX, os={kernel=3.10.0-957.27.2.el7.x86_64, codename=Core, name=CentOS Linux, family=redhat, version=7 (Core), platform=centos}, containerized=false, name=XXXXX, id=XXXXXXX, architecture=x86_64}'

ご質問
上記エラーの原因が分かりましたら教えてください。

気になることとして、Logstashの別のconfigにてpipelineの向き先を「squid_access」にしたところエラーにはなりませんでした。
今回のconfigとの差異はfilter句に処理を書いているか書いていないかです。そのためconfigのfilter句の記載に問題がありそうです。

エラーは、textとして定義されている[host]というフィールドに、Preview of fieldsの後にあるようなオブジェクトを入れようとしているから、と見受けられます。

GET /squid_access/_mapping

として、hostフィールドがどのように定義されているか確認してみてください。

    "mappings" : {
      "properties" : {
        "host" : {
          "type" : "text",
          }
        }
      }
    }

と、このようになっていたらsquid_accessのマッピングが入れたいデータとあっていないということになろうかと思います。

同じエラーを起こす簡単な再現手順です。

# hostフィールドをtextで定義されるようにする
PUT hoge/_doc/1
{
  "host": "aiueo"
}

# textで定義されたフィールドにオブジェクトを入れる
PUT hoge/_doc/2
{
  "host" : {
    "hostname": "XXXXX",
    "os": {
      "kernel":"3.10.0-957.27.2.el7.x86_64", 
      "codename": "Core", 
      "name":"CentOS Linux",
      "family": "redhat", 
      "version":"7 (Core)",
      "platform": "centos"
      
    }, 
    "containerized": false,
    "name": "XXXXX",
    "id": "XXXXXXX",
    "architecture": "x86_64"
  }
}

表示されるエラー

 "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "failed to parse field [host] of type [text] in document with id '2'. Preview of field's value: '{hostname=XXXXX, os={kernel=3.10.0-957.27.2.el7.x86_64, codename=Core, name=CentOS Linux, family=redhat, version=7 (Core), platform=centos}, containerized=false, name=XXXXX, id=XXXXXXX, architecture=x86_64}'"
      }
    ],

以上のことから、提示された情報からはlogstashのfilterの有無よりも、マッピング情報をまず確認したいです。

早急に回答頂きありがとうございます。

indexのマッピング情報を確認しました。
おっしゃる通り、hostの型がtext型で定義されていました。

iindexを新規で作り直し、データとindexの型を合わせ実行したところエラーは解消されました。

大変助かりました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.