そこで、Docker + Supervisord + Django app by uWSGIで実験します。スタック全体が正常に動作していますが、ログを整理する必要があります。
非デーモンモードでスーパーバイザを起動すると、
/usr/bin/supervisord -n
次に、docker logs stdoutで再生されるスーパーバイザのログ出力を取得します。ただし、supervisordがデーモンモードの場合、独自のログはコンテナファイルシステムに隠され、アプリケーションのログも独自のapp__stderr/stdoutファイルに格納されます。
私が欲しいのは、スーパーバイザーとアプリケーションの標準出力の両方をdockerログに記録することです。
非デーモンモードで監視を開始することは、このための賢明なアイデアですか、それとも意図しない結果を引き起こしますか?また、アプリケーションログをDockerログにも再生するにはどうすればよいですか?
私は同意します。デーモンモードを使用しないことが最良の解決策のように聞こえますが、実際の物理サーバーまたはある種のVMセットアップ:ログの集中化を行う場合と同じ戦略を使用するでしょう。
コンテナー内で logstash のような自己ホスト型を使用して、ログを収集し、中央サーバーに送信することができます。または、logglyやpapertrailなどの商用サービスを使用して同じことを行います。
私はこれを使ってこれを達成しました。
Dockerイメージに supervisor-stdout をインストールします。
RUN apt-get install -y python-pip && pip install supervisor-stdout
supervisord.conf
のように見えます:
[program:myprogram]
command=/what/ever/command
stdout_events_enabled=true
stderr_events_enabled=true
[eventlistener:stdout]
command = supervisor_stdout
buffer_size = 100
events = PROCESS_LOG
result_handler = supervisor_stdout:event_handler
Dockerコンテナーはkleenexのようなもので、使用してからドロップします。 「生きている」ためには、Dockerはフォアグラウンドで実行されるものを必要とします(デーモンはバックグラウンドで実行されます)。そのため、Supervisordを使用しています。
したがって、コンテナーの実行時に表示される監視出力にプロセス出力(アクセスとエラー)を「リダイレクト/追加/マージ」する必要があります。
Drewが言ったように、誰もが https://github.com/coderanger/supervisor-stdout を使用してそれを達成しています(私にはこれを監視対象プロジェクトに追加する必要があります!)。ドリューが言うのを忘れた、あなたは追加する必要があるかもしれません
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
監視プログラム構成ブロックへ。
また、非常に便利なものとして、プロセスがstdoutではなくログファイルにログを記録していると想像してください。監視するように監督者に依頼することができます。
[program:php-fpm-log]
command=tail -f /var/log/php5-fpm.log
stdout_events_enabled=true
stderr_events_enabled=true
これにより、php5-fpm.logのコンテンツがstdoutにリダイレクトされ、supervisord-stdoutを介してスーパーバイザーstdoutにリダイレクトされます。
supervisor-stdoutはpython-pipをインストールする必要があります。これは、150 MBをダウンロードします。コンテナーには、別のツールをインストールするためだけにたくさんあると思います。
ログファイルを/ dev/stdoutにリダイレクトすると、うまくいきます:
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html
今日のベストプラクティスは、Dockerイメージを最小限にすることです。私にとって、Pythonアプリケーションを含む理想的なコンテナには、コード、サポートライブラリ、および必要に応じてuwsgi
などが含まれます。
https://github.com/msgre/uwsgi_logging にソリューションを1つ公開しました。シンプルですDjango uwsgi
の背後にあるアプリケーションuwsgi
およびDjango supervisor
が必要です。
実際、非デーモンモードで監視プログラムを開始することが最善のソリューションです。
ボリュームを使用して、監視対象のログを中央の場所にマウントすることもできます。