2017-02-08 15 views
1

私はこのようになり、ログ・ファイル(簡体字)を持っている:logstashでいくつかのフィールドを解析しないでください。

{ "startDate": "2015-05-27", "endDate": "2015-05-27", 
    "request" : {"requestId":"123","field2":1,"field2": 2,"field3":3, ....} } 

ログイン-スタッシュはparseにフィールド「リクエスト」を含むすべてのフィールドをしようとします。しかし、このフィールドを解析しないことは可能ですか?
"request"フィールドがelastic-searchにありますが、解析しないでください。ここ

は私の設定ファイルの一部である:ここ

input { 
    file { 
     type => "json" 
     path => [ 
       "/var/log/service/restapi.log" 
     ] 
     tags => ["restapi"] 
    } 
} 

filter { 
    ruby { 
     init => "require 'socket'" 
     code => " 
      event['host'] = Socket.gethostname.gsub(/\..*/, '') 
      event['request'] = (event['request'].to_s); 
     " 
    } 

    if "restapi" in [tags] { 
     json { 
      source => "message" 
     } 
     date { 
       match => [ "date_start", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date_start" 
     } 
     date { 
       match => [ "date_end", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date_end" 
     } 
     date { 
       match => [ "date", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date" 
     } 
    } 
} 
output { 
    if "restapi" in [tags] { 
     elasticsearch { 
      hosts => ["......."] 
      template_name => "logs" 
      template => "/etc/logstash/templates/service.json" 
      template_overwrite => true 
      index => "service-logs-%{+YYYY.MM.dd}" 
      idle_flush_time => 20 
      flush_size => 500 
     } 
    } 
} 

は私のテンプレートファイルです:

{ 
    "template" : "service-*", 
    "settings" : { 
    "index": { 
      "refresh_interval": "60s", 
      "number_of_shards": 6, 
      "number_of_replicas": 2 
     } 
    }, 
    "mappings" : { 
    "logs" : { 
     "properties" : { 
     "@timestamp" : { "type" : "date", "format" : "dateOptionalTime" }, 
     "@version" : { "type" : "integer", "index" : "not_analyzed" }, 
     "message": { "type" : "string", "norms" : { "enabled" : false } }, 
     "method" : { "type" : "string", "index" : "not_analyzed" }, 
     "traffic_source" : { "type" : "string", "index" : "not_analyzed" }, 
     "request_path" : { "type" : "string", "index" : "not_analyzed" }, 
     "status" : { "type" : "integer", "index" : "not_analyzed" }, 
     "host_name" : { "type" : "string", "index" : "not_analyzed" }, 
     "environment" : { "type" : "string", "index" : "not_analyzed" }, 
     "action" : { "type" : "string", "index" : "not_analyzed" }, 
     "request_id" : { "type" : "string", "index" : "not_analyzed" }, 
     "date" : { "type" : "date", "format" : "dateOptionalTime" }, 
     "date_start" : { "type" : "date", "format" : "dateOptionalTime" }, 
     "date_end" : { "type" : "date", "format" : "dateOptionalTime" }, 
     "adnest_type" : { "type" : "string", "index" : "not_analyzed" }, 
     "request" : { "type" : "string", "index" : "not_analyzed" } 
     } 
    } 
    } 
} 

ここlogstash.logから

response=>{"create"=>{"_index"=>"logs-2017.02.08", "_type"=>"json", "_id"=>"AVoeNgdhD5iEO87EVF_n", "status" =>400, "error"=> "type"=>"mapper_parsing_exception", "reason"=>"failed to parse [request]", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"unknown property [requestId]" }}}}, :level=>:warn} 
+1

あなたが何を求めているのかはっきりしません。そのjsonオブジェクトの文字列バージョンに等しい "要求"を表示するように要求していますか? – Alcanzar

+0

Logstashはあなたにそれを依頼していないことはあまりありません。あなたの質問にあなたの設定の基本を含めることが役立ちます。また、「解析する」という意味を定義すると、その質問が明確になります。また、elasticsearch自体を見ているのか、かばんを使っていますか(時には独自の方法を表現しています)。 –

+0

@Alcanzar、はい、私は、フィールド "要求"インストリングのjson-valueが私にとって十分であると思うと思います。 –

答えて

1

あなたはルビーフィルタでこれを行うことができる必要があります:

filter { 
    ruby { 
     init => "require 'socket'" 
     code => " 
      event['host'] = Socket.gethostname.gsub(/\..*/, '') 
      event['request'] = (event['request'].to_s); 
     " 
    } 

    if "restapi" in [tags] { 
     ruby { 
       code => ' 
        require "json" 
        event.set("request",event.get("request").to_json)' 
     } 
     date { 
       match => [ "date_start", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date_start" 
     } 
     date { 
       match => [ "date_end", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date_end" 
     } 
     date { 
       match => [ "date", "yyyy-MM-dd HH:mm:ss" ] 
       target => "date" 
     } 
    } 
} 

スタブアウト標準入力/標準出力でこれをテスト:

input { 
stdin { codec => json } 
} 
// above filter{} block here 
output { 
    stdout { codec=>rubydebug} 
} 

このようなテスト:

echo '{ "startDate": "2015-05-27", "endDate": "2015-05-27", "request" : {"requestId":"123","field2":1,"field2": 2,"field3":3} }' | bin/logstash -f test.conf 

それは、この出力:

{ 
    "startDate" => "2015-05-27", 
     "endDate" => "2015-05-27", 
     "request" => "{\"requestId\"=>\"123\", \"field2\"=>2, \"field3\"=>3}", 
     "@version" => "1", 
    "@timestamp" => "2017-02-09T14:37:02.789Z", 
      "host" => "xxxx" 
} 

は、だから私はあなたの元の質問に答えました。テンプレートが機能しない理由が分からない場合は、別の質問をする必要があります。

+0

トピック - 私の設定ファイルの一部を追加しました。あなたは私がこの設定に私のアドバイスしたことをどのように追加することができますか? –

+0

既存の 'ruby {}'フィルタの後に別のフィルタとして追加するだけで、 – Alcanzar

+0

を表示できますか?最初のものの後ろにもう一つのフィルタ{}をruby {}で追加しました。設定エラーです。再起動しません。詳細についてはconfigtestパラメータで再実行してください。 –

0

ElasticSearchがフィールドを分析していますデフォルトでは 必要なものがrequestフィールドを分析しないだけの場合は、フィールドのマッピングに"index": "not-analyzed"を設定することで、インデックス方法を変更します。

ドキュメントから詳細情報here

+0

あなたの応答をありがとうが、私はすでに 'not_analyzed'を使って試してみましたが、このフィールドには****。テンプレートファイルの設定を指定しませんでした...同じ問題が残っています(トピックが更新されました) –

関連する問題