web-dev-qa-db-ja.com

LogStashでJSONを使用する

私はここで気が狂います。ログをファイルに書き込むアプリがあります。各ログエントリはJSONオブジェクトです。 .jsonファイルの例は次のようになります。

{"Property 1":"value A","Property 2":"value B"}
{"Property 1":"value x","Property 2":"value y"}

LogStashにログエントリを取得しようと必死です。これを行うために、次のLogStash構成ファイルを作成しました。

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
    codec => "json"
  }
}
output {
  file {
    path => "/logs/out.log"
  }
}

現時点では、手動でレコードをmylogs.logに追加して、動作させるようにしています。ただし、stdoutに奇妙に表示されます。 out.logを開くと、次のようなものが表示されます。

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","Host":"ip-[myAddress]","path":"/logs/mylogs.log"}

このため、メッセージをElasticSearchに送信しても、フィールドは取得されません。代わりに、ごちゃごちゃになります。プロパティがプロパティのままである必要があります。メッセージ部分や出力に詰め込まれたくない。私はこれがコーデックと何か関係があると思います。しかし、私にはわかりません。 logstash入力設定でコーデックを変更する必要があるかどうかはわかりません。または、出力構成で入力を変更する必要がある場合。私はこの時点で必死になっているので、どんな助けでも心から感謝します。

ありがとう.

29
user70192

json codec を削除して jsonフィルター を追加してみてください

input {
  file {
    type => "json"
    path => "/logs/mylogs.log"
  }
}
filter{
    json{
        source => "message"
    }
}
output {
  file {
    path => "/logs/out.log"
  }
}

ソースJSONをデコードしたくないので、jsonコーデックは必要ありませんが、入力をフィルター処理して@messageフィールドのみのJSONデータを取得する必要があります。

お役に立てれば。

37
vzamanillo

デフォルトでは、jsonコーデックが指定されていない場合、tcpはすべてをメッセージフィールドに入れます。

Jsonコーデックを指定した後のメッセージフィールドの_ jsonparsefailureの回避策も、以下を実行することで修正できます。

input {
  tcp {
    port => '9563'
  }
}
filter{
  json{
    source => "message"
    target => "myroot"
  }
  json{
    source => "myroot"
  }

}
output {
    elasticsearch {
      hosts => [ "localhost:9200" ]
    }
}

それはフィールドmyrootに適切なjson文字列にメッセージフィールドを解析し、myrootが解析されてjsonを生成します。

message asのような冗長フィールドを削除できます

filter {
  json {
    source => "message"
    remove_field => ["message"]
  }
}
11
Tinkal Gogoi