Logstashのgrokを使用して、JSONデータと非JSONデータが混在するログ行からフィールドを抽出できません

アヌープ

DockerコンテナーでいくつかのSpringBootアプリケーションを実行しています。ファイルにログを記録したくないので、代わりにコンソールにログを記録し、logspout使用してログLogstashに転送しています。私が使用していますlogstash-logback-エンコーダをJSON形式のアプリケーションからのすべてのログをログに記録します。

これらとは別に、Spring Bootアプリケーションを起動する前にDockerコンテナーによって作成されるログ(コンソール出力)もいくつかあります。これらはJSON形式ではありません。

これらの両方に、LogspoutはLogstashに送信する前にメタデータ(コンテナー名、コンテナーIDなど)を追加します。以下は、両方の形式のログの例です。

  1. コンテナから直接(JSONなし)

<14> 1 2016-12-01T12:58:20Z 903c18d47759 com-test-myapp 31635 ---テストするアクティブプロファイルの設定

  1. アプリケーションログ(JSON形式)

<14> 1 2016-12-01T13:08:13Z 903c18d47759 com-test-myapp 31635 --- {"@timestamp": "2016-12-01T13:08:13.651 + 00:00"、 "@ version":1 、 "message": "一部のログメッセージがここに表示されます"、 "logger_name": "com.test.myapp.MyClass"、 "thread_name": "http-nio-8080-exec-1"、 "level": "DEBUG" 、 "level_value":10000、 "HOSTNAME": "903c18d47759"}

以下は私のLogstashgrok構成です。

input {
  tcp {
    port => 5000
    type => "logspout-syslog-tcp"
  }
}
filter {
  if [type] == "logspout-syslog-tcp" {
    grok {
      match => {
        "message" => [
          "<%{NUMBER:syslogPriority}>1 %{TIMESTAMP_ISO8601:eventTimestamp} %{BASE16NUM:containerId} %{DATA:containerName} %{NUMBER:containerPort} - - %{DATA:jsonLog}",
          "<%{NUMBER:syslogPriority}>1 %{TIMESTAMP_ISO8601:eventTimestamp} %{BASE16NUM:containerId} %{DATA:containerName} %{NUMBER:containerPort} - - %{DATA:regularLog}"
        ]
      }
    }

    json {
        source => "jsonLog"
        target => "parsedJson"
        remove_field=>["jsonLog"]
    }

    mutate {
      add_field => {
        "level" => "%{[parsedJson][level]}"
        "thread" => "%{[parsedJson][thread_name]}"
        "logger" => "%{[parsedJson][logger_name]}"
        "message" => ["%{[parsedJson][message]}"]
      }
    }
  }
}
output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

これに基づいて、JSONの各フィールドをElasticsearch / Kibanaのフィルターとして使用できるようにしたいと考えていました。しかし、私はそれらのフィールドの値を取得することができません。Kibanaでは次のように表示されます。ここに画像の説明を入力してください

ここで何が欠けているのかわかりません。JSONからフィールドを抽出するにはどうすればよいですか?また、grokフィルターはJSONログと非JSONログの両方を処理するために正しいですか?

ありがとう、アヌープ

baudsp

問題は%{DATA:jsonLog}部品にあります。DATAパターン.*?は貪欲ではないためここを参照)、何も取得せず、jsonLogフィールドを作成しませんGREEDYDATA代わりにパターンを使用する必要があります

パターンをテストするには、http://grokconstructor.appspot.com/do/match#result参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ