DockerコンテナーとDockerfile
にphp-fpmがあります。fpm構成ファイル(/etc/php5/fpm/pool.d/www.conf
)を編集して、/var/log/fpm-access.log
にアクセスするためのアクセスログと、 /var/log/fpm-php.www.log
:
# Do some php-fpm config
# Redirect worker stdout and stderr into main error log
# Activate the fpm access log
# Enable display errors
# Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
sed -i '/^;php_admin_flag\[log_errors\]/cphp_admin_flag[log_errors] = on' /etc/php5/fpm/pool.d/www.conf
これは正常に機能します。シェルをコンテナに入れてログを表示できます。しかし...それはベストプラクティスではありません。
問題は、docker log collectorを使用しようとしたときです-dockerがそれらをキャプチャして提供できるように、標準出力またはstderrにログを記録するにはphp-fpmが必要ですdocker logs
コマンドに追加します。
私はDockerfile
でこれを試みました(これは 公式のnginx Dockerイメージ からコピーしたアイデアです):
# Redirect fpm logs to stdout and stderr so they are forwarded to the docker log collector
RUN ln -sf /dev/stdout /var/log/fpm-access.log && \
ln -sf /dev/stderr /var/log/fpm-php.www.log
これは機能していません-docker logs
からアクセスログが表示されません-理由を理解しようとしていますか? dockerでfpmを使用する他の誰かが、dockerログコレクターにロギングを機能させるように管理しましたか?
これを行う方法は、エラーとアクセスログを次のアドレスに送信することです。
/proc/self/fd/2
php5-fpm.log
追加:
access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
公式の最新バージョン PHP fpm docker image で焼き込まれた fpm config は、標準ストリームに書き込みます。
error_log = /proc/self/fd/2
...
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
PHP-FPMログはSTDERRにのみ表示されるため、必要に応じてfpm.log
を/dev/stderr
にシンボリックリンクできます。
ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log