12ファクターアドバイザリに準拠してサードパーティアプリケーションを展開していますが、ポイントの1つは、アプリケーションログをstdout / stderrに出力する必要があることを示しています。その後、クラスタリングソフトウェアがそれを収集できます。
ただし、アプリケーションはファイルまたはsyslogにのみ書き込むことができます。代わりにこれらのログを印刷するにはどうすればよいですか?
12ファクターアドバイザリに準拠してサードパーティアプリケーションを展開していますが、ポイントの1つは、アプリケーションログをstdout / stderrに出力する必要があることを示しています。その後、クラスタリングソフトウェアがそれを収集できます。
ただし、アプリケーションはファイルまたはsyslogにのみ書き込むことができます。代わりにこれらのログを印刷するにはどうすればよいですか?
回答:
驚くべきレシピがnginx Dockerfileで提供されています:
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
単純に、アプリはファイルとしてファイルへの書き込みを続けることができますが、その結果、行はstdout
&に移動しstderr
ます!
squid3
、そしてそれは上のアクセス許可に問題があり/dev/stdout
ます。
別の質問で、親が終了したときに子プロセスを強制終了し、これを整理するのに役立つ応答を得ました。
このようにして、ファイルにログを記録し、継続的tail -f
に記録するようにアプリケーションを構成します。幸いなことに、tail
受け入れることができます--pid PID
:指定されたプロセスが終了すると終了します。$$
そこに置きます:現在のシェルのPID。
最後のステップとして、起動されたアプリケーションがexec
削除されます。つまり、現在のシェルがそのアプリケーションに完全に置き換えられます。
ランナースクリプト、run.sh
は次のようになります。
#! /usr/bin/env bash
set -eu
rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &
exec /path/to/my-application --logfile /var/log/my-application.log
注:を使用tail -F
すると、ファイル名がリストされ、後で表示されてもファイル名が読み取られます!
最後に、最小限のDockerfile:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
注:いくつかの非常に奇妙なtail -f
動作(「リモートファイルに置き換えられました。この名前を放棄します」と言います)を動作させるために、別の方法を試しました:既知のログファイルはすべて作成され、起動時に切り捨てられます。 、そしてその時だけ-それらを尾:
#! /usr/bin/env bash
set -eu
LOGS=/var/log/myapp/
( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )
tail --pid $$ -n0 -F $LOGS/* &
exec /usr/sbin/apache2 -DFOREGROUND
tail
、--pidオプションなしでBusyBoxで正常に動作するようです。
Dockerコンテナのバックグラウンドプロセス、たとえばexecを使用して/ bin / bashに接続するには、使用できました。
echo "test log1" >> /proc/1/fd/1
これにより、出力がpid 1のstdoutに送信されます。これは、1つのdockerピックアップです。
docker logs
またはによって表示されませんkubectl logs
。PID1として実行されていないcrontabを介してタスクをスケジュールするコンテナーがあります。