0

次の構成で Logstash を使用してログを受信して​​います。

input {
  udp {
    type => "logs"
    port => 12203
  }
}

filter {
  grok {
    type => "tracker"
     pattern => '%{GREEDYDATA:message}'
  }
  date {
    type => "tracker"
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss,SSS" ]
  }
}

output{
    tcp{
         type => "logs"
         host => "host"
         port => 12203
    }
}

"host"次に、次の設定を使用して、マシンでログを取得します。

input {
      tcp {
                      type => "logs"
                      port => 12203
                        }
}


output {
    pipe {
        command => "python /usr/lib/piperedis.py"
    }
}

ここから、行の解析を行い、それらを Redis データベースに入れます。しかし、興味深い問題が発見されました。

Logstash は、ログ メッセージを JSON スタイルのパッケージに「ラップ」します。

{\"@source\":\"source/\",\"@tags\":[],\"@fields\":{\"timestamp\":[\"2013-09-16 15:50:47,440\"],\"thread\":[\"ajp-8009-7\"],\"level\":[\"INFO\"],\"classname\":[\"classname\"],\"message\":[\"message"\]}}

次に、それを受信して​​次のマシンに渡すと、それをメッセージとして受け取り、別のラッパーに入れます! 実際のログ メッセージのみに関心があり、その他のもの (ソース パス、ソース、タグ、フィールド、タイムスタンプなど) には関心がありません。

フィルターなどを使用してこれを行う方法はありますか? ドキュメントを調べましたが、Logstash のインスタンス間で生のログ行を渡すだけの方法が見つかりません。

ありがとう、

マット

4

2 に答える 2

1

logstash のドキュメントは間違っています。デフォルトの「コーデック」がプレーンであることを示していますが、実際にはコーデックを使用していません。出力形式を使用しています。

より単純な出力を得るには、出力を次のように変更します

output {
    pipe {
        command => "python /usr/lib/piperedis.py"
        message_format =>  "%{message}"
    }
}
于 2013-10-03T04:29:19.980 に答える
0

これらのメッセージを標準出力から抽出しないのはなぜですか?

line = sys.stdin.readline()
line_json = json.loads(line)
line_json['message'] # will be your @message
于 2013-12-11T03:04:14.873 に答える