8

私は中央ログ サーバーとして graylog を使用しており、ログ メッセージを graylog に送信するために gelf log4j2-appender を使用しています。これはうまくいきます。これで、アプリケーションの Docker イメージを作成し、ソフトウェアを Docker コンテナーとして実行できるようになりました。

docker を使用して、stdout (console-appender) にもログを記録し、アプリケーション ログを docker (docker logs {containerId}) に取得します。

ここで、gelf log4j2-appender を割愛して、代わりに docker log-driver/gelf のプラグインを使用できるかどうか自問します。( https://docs.docker.com/engine/admin/logging/overview/を参照)

ここでのベストプラクティスは何ですか?docker log プラグインを使用すると文字列メッセージ全体が graylog に送信され、graylog はその文字列からメタ情報を抽出する必要があると思います (したがって、log_level などのログ メッセージ内でこのメタ データを提供する必要があります)。これにより、graylog 側でより多くのリソースが消費される可能性があり、エラー メッセージのみを graylog に送信するように docker を構成することもできません。これにより、ネットワーク トラフィックが増加します。log4j2 gelf-appender を使用すると、メインのログ メッセージにメタ データを含めずに、ログ メッセージに追加のメタ データを提供できます。グレイログ側で抽出する必要はありません。log_level によってどのメッセージを graylog に送信するかを構成することもできます。それとも私は間違っていますか?最適な解決策は何ですか、またはログを graylog に送信する各方法の長所と短所は何ですか?

4

1 に答える 1

7

すべてを stdout に記録し、Docker の GELF ロギング ドライバーを使用する代わりに、使用しているロギング フレームワーク (例: logstash-gelf ) に既存の GELF アペンダーを使用することをお勧めします。

ネイティブ Java ロギング フレームワークで適切な GELF アペンダーを使用すると、MDCなどの高度な機能を使用して、サーバー側でメッセージを受信した後にそれらのメッセージを再解析することなく、価値のある構造化された情報でログ メッセージを充実させることができます。Docker GELF ロギング ドライバーを使用すると、ログ メッセージを 1 行ごとに受け取るだけで済みます。これは、特に Java アプリケーションの場合、対処するのが頭痛の種になる可能性があります (複数行のスタック トレースを考えてみてください)。

ほとんどのロギング フレームワークは静的フィールドをサポートしているため、たとえば Docker コンテナの ID を「注入」できます。

于 2016-05-12T13:02:10.003 に答える