web-dev-qa-db-ja.com

Dockerコンテナーで実行しているときにphp-fpmがstdout / stderrにログを記録する方法

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ログコレクターにロギングを機能させるように管理しましたか?

19
Tom

これを行う方法は、エラーとアクセスログを次のアドレスに送信することです。

/proc/self/fd/2

php5-fpm.log 追加:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
25

公式の最新バージョン 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
15
Darren Gordon

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
1
Andi