web-dev-qa-db-ja.com

DockerコンテナーからELKにアプリケーションログを転送する方法

複数のアプリケーションテクノロジー(Java、RailsおよびさまざまなDB)を使用する環境でロギングを集中化しようとしています。

開発者にはDocker Composeでスタックを表示してもらいたいのですが、実行中のDockerコンテナーにシェルを開くのではなく、中央のログソース(ELK)を参照して問題をデバッグしたいと考えています。

アプリケーションはすべて、STDOUT/STDERRではなくファイルシステムに書き込みます。これにより、Dockerロギングドライバーに関連するすべてのオプションが削除され、logpoutも削除されます。

コンテナを構成して、rsyslogにアプリケーションログファイルを含め、syslog入力を持つlogstashに転送するようにしました。これはログをAからBに移動するという点で機能しますが、syslog入力に基づいてELKでマルチテクノロジーログを管理することは恐ろしいです(たとえば、マルチネンをキャプチャしようとするJavaスタックトレース、またはMySQLの遅いクエリ) )。

これを行うより良い方法はありますか?各コンテナーでlogstashを実行して、フィルターとコーデックをログファイルに直接適用できるようにして、syslog入力に依存する必要がないようにする必要がありますか?

ファイルシステムに書き込まれるアプリケーションログファイルでDockerロギングドライバーを使用する方法はありますか?

5
Garreth McDaid

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は、コンテナーの視点ではなく、コンテナーの視点からのものです)

2
Jason Martin

Logstashを構成して、デフォルトでdockerが生成するさまざまな jsonログファイル を解析することもできます。

別のアプローチは、Kubernetesでいわゆるサイドカーを使用することです。

cluster logging の概念のページでいくつかの異なる例を提供しています。

その概念をどのように適用するかは、完全にニーズによって異なります。

ただし、単純な概念実証は次の方法で機能します。

  • 着信syslogストリームを受け入れるlogstashサイドカーを作成する(syslog入力を使用するなど)
  • dockerの syslogドライバー を使用するようにすべてのコンテナーを構成して、ロギングをサイドカーに送信します。

もちろん、中央のsyslogリスナーを(logstashやrsyslogなどを使用して)セットアップし、サイドカーなしでこれを行うこともできます。

このアプローチも、GELFを使用するという@ Jason Martin の提案とほとんど同じです。

ローカルサイドカーのもう1つの使用法は、 file input を使用してlogstashを実行するコンテナーを作成し、ログボリューム(/ var/log /、/ logsなど)を公開することです。次に、そのボリュームを他のコンテナーと共有して、ログ(/logs/$INSTANCE_ID/file.logなど)に書き込み、logstashでそれらを解析できるようにします。

この最後のセットアップでは、STDOUT/STDERRではなくファイルを監視できますが、おそらくログディレクトリchmod 1777(またはいくつかのサイドカー)が必要になります。

もちろん、「逆」の設定も機能します(ただし、管理/保守が難しいようです)。アプリケーションコンテナーにログボリュームを公開させ、logstashサイドカー取引でログボリュームの内容を読み取らせます。

0