2016-05-12 4 views
6

私は中央ログサーバーとしてgraylogを使用しています。私はgelf log4j2-appenderを使ってログメッセージをgraylogに送信しています。これは正常に動作します。今私はアプリケーションのドッカー画像を作成しました。私はドッカーコンテナーとしてソフトウェアを実行できます。dockerコンテナ内で実行されるJVMアプリケーションからログをgraylogに送信するにはどうすればよいですか?

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

私はgelf log4j2-appenderに余裕を持ってgelfの代わりにドッカーのログドライバ/プラグインを使うことができます。 (https://docs.docker.com/engine/admin/logging/overview/を参照)

ここでベストプラクティスは何ですか?私はドッカーのログプラグインを使用すると、全体の文字列メッセージをgraylogに送信し、graylogはその文字列からメタ情報を抽出する必要があると思います(このため、log_levelなどのログメッセージ内にこのメタデータを提供する必要があります)。これはgraylog側でより多くのリソース消費を引き起こし、graockogにエラーメッセージだけを送るためのドッカーを設定することもできません。これにより、より多くのネットワークトラフィックが発生します。 log4j2 gelf-appenderを使用すると、メインログメッセージにそれを含めずにログメッセージにいくつかのメタデータを追加することができ、グリーロッグ側で抽出する必要はありません。また、どのメッセージをgraylogに送るかをlog_levelで設定することもできます。または私は間違っていますか?最高の解決策は何ですか、あるいは、グライロッグにログを送信するそれぞれの方法の賛否両論は何ですか?

答えて

4

すべてを標準出力にロギングする代わりに、使用しているロギングフレームワーク(たとえばlogstash-gelf)に既存のGELFアペンダーを使用し、DockerのGELFロギングドライバーを使用することをおすすめします。

ネイティブJavaロギングフレームワークを持つ適切なGELFアペンダーを使用すると、MDCのような高度な機能を使用して、サーバー側で受信したメッセージを再解析することなく、貴重な構造化情報でログメッセージを豊かにできます。 Docker GELFロギングドライバを使用すると、1行あたりのログメッセージしか受信できません。特に、Javaアプリケーションでは、扱う頭痛になることがあります(複数行のスタックトレースと考える)。

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

関連する問題