私はここで気が狂います。ログをファイルに書き込むアプリがあります。各ログエントリは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入力設定でコーデックを変更する必要があるかどうかはわかりません。または、出力構成で入力を変更する必要がある場合。私はこの時点で必死になっているので、どんな助けでも心から感謝します。
ありがとう.
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データを取得する必要があります。
お役に立てれば。
デフォルトでは、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"]
}
}