2016-09-01 6 views
0

json形式のログをLogstashサーバーに送信します。 (:メッセージ全体が一行に本当にですが、私は読書を容易にするために複数行でそれを示し注)私は得るために、私Logstash構成で配置する必要が何Logstashでjson形式のログメッセージを解析して特定のキーと値のペアを取得するにはどうすればよいですか?

2016-09-01T21:07:30.152Z 153.65.199.92 
{ 
    "type":"trm-system", 
    "host":"susralcent09", 
    "timestamp":"2016-09-01T17:17:35.018470-04:00", 
    "@version":"1", 
    "customer":"cf_cim", 
    "role":"app_server", 
    "sourcefile":"/usr/share/tomcat/dist/logs/trm-system.log", 
    "message":"some message" 
} 

をログには、次のようになります"sourcefile"の値を取得し、最終的にファイル名を取得します(例:trm-system.log?

答えて

1

ハッシュフィールド(タイムスタンプなし)をESにポンピングすると、それを認識するはずです。

logstashパイプライン内で実行する場合は、json filterを使用し、source =>を2番目の部分に(おそらくタイムスタンププレフィックスを戻して)指定します。すべてのフィールドで

この結果は、現在のメッセージに追加され、あなたがそれらを直接アクセスしたりすることができ、すべての組み合わせ:

設定:

input { stdin { } } 
filter { 
    # split line in Timestamp and Json 
    grok { match => [ message , "%{NOTSPACE:ts} %{NOTSPACE:ip} %{GREEDYDATA:js}"] } 

    # parse json part (called "js") and add new field from above 
    json { source => "js" } 
} 
output { 
    # stdout { codec => rubydebug } 
    # you access fields directly with %{fieldname}: 
    stdout { codec => line { format => "sourcefile: %{sourcefile}"} } 
} 

サンプル実行

2016-09-01T21:07:30.152Z 153.65.199.92 { "sourcefile":"/usr" } 
sourcefile: /usr 

とrubydebugと

(ホストと@タイムスタンプは削除されました):

{ 
    "message" => "2016-09-01T21:07:30.152Z 153.65.199.92 { \"sourcefile\":\"/usr\" }", 
    "@version" => "1", 
     "ts" => "2016-09-01T21:07:30.152Z", 
     "ip" => "153.65.199.92", 
     "js" => "{ \"sourcefile\":\"/usr\" }", 
"sourcefile" => "/usr" 
} 

ご覧のとおり、フィールドsourcefileは、rubydebug出力の値で直接認識されます。

ログレコードのソースによっては、multilineコーデックも使用する必要があります。また、jsフィールドを削除し、@timestampの名前を_parsedateに変更し、tsを解析して、レコードのタイムスタンプ(木場は満足している)にすることもできます。これはサンプルには表示されていません。また、スペースを節約するためにmessageを削除します。

+0

出力プラグインでファイル名を使用したいので、Logstashパイプラインで解析します。私はjsonフィルターを見ましたが、ドキュメントは特定のフィールドを取得する方法を説明していません。あなたの答えを詳述してください。 –

+0

@ChrisF done :) – eckes

関連する問題