複数のアプリケーションテクノロジー(Java、RailsおよびさまざまなDB)を使用する環境でロギングを集中化しようとしています。
開発者にはDocker Composeでスタックを表示してもらいたいのですが、実行中のDockerコンテナーにシェルを開くのではなく、中央のログソース(ELK)を参照して問題をデバッグしたいと考えています。
アプリケーションはすべて、STDOUT/STDERRではなくファイルシステムに書き込みます。これにより、Dockerロギングドライバーに関連するすべてのオプションが削除され、logpoutも削除されます。
コンテナを構成して、rsyslogにアプリケーションログファイルを含め、syslog入力を持つlogstashに転送するようにしました。これはログをAからBに移動するという点で機能しますが、syslog入力に基づいてELKでマルチテクノロジーログを管理することは恐ろしいです(たとえば、マルチネンをキャプチャしようとするJavaスタックトレース、またはMySQLの遅いクエリ) )。
これを行うより良い方法はありますか?各コンテナーでlogstashを実行して、フィルターとコーデックをログファイルに直接適用できるようにして、syslog入力に依存する必要がないようにする必要がありますか?
ファイルシステムに書き込まれるアプリケーションログファイルでDockerロギングドライバーを使用する方法はありますか?
Dockerの最近のバージョンでは、ログを「GELF」形式でネットワークポートに送信できます。 LogstashにはGELF入力があります。すべてのノードでLogstashを実行し、ノード上のすべてのDockerインスタンスを転送することができます。
Logstash入力として: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-gelf.html
gelf {
}
Docker出力の場合: https://docs.docker.com/engine/admin/logging/overview/#gelf
$ docker run -dit \
--log-driver=gelf \
--log-opt gelf-address=udp://127.0.0.1:12201 \
Alpine sh
(gelf-addressは、コンテナーの視点ではなく、コンテナーの視点からのものです)
Logstashを構成して、デフォルトでdockerが生成するさまざまな jsonログファイル を解析することもできます。
別のアプローチは、Kubernetesでいわゆるサイドカーを使用することです。
cluster logging の概念のページでいくつかの異なる例を提供しています。
その概念をどのように適用するかは、完全にニーズによって異なります。
ただし、単純な概念実証は次の方法で機能します。
もちろん、中央のsyslogリスナーを(logstashやrsyslogなどを使用して)セットアップし、サイドカーなしでこれを行うこともできます。
このアプローチも、GELFを使用するという@ Jason Martin の提案とほとんど同じです。
ローカルサイドカーのもう1つの使用法は、 file input を使用してlogstashを実行するコンテナーを作成し、ログボリューム(/ var/log /、/ logsなど)を公開することです。次に、そのボリュームを他のコンテナーと共有して、ログ(/logs/$INSTANCE_ID/file.logなど)に書き込み、logstashでそれらを解析できるようにします。
この最後のセットアップでは、STDOUT/STDERRではなくファイルを監視できますが、おそらくログディレクトリchmod 1777
(またはいくつかのサイドカー)が必要になります。
もちろん、「逆」の設定も機能します(ただし、管理/保守が難しいようです)。アプリケーションコンテナーにログボリュームを公開させ、logstashサイドカー取引でログボリュームの内容を読み取らせます。