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


18

Dockerコンテナーにphp-fpmがあり、fpm構成Dockerfileファイル(/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ログコレクターを使用しようとするときです-Dockerがそれらをキャプチャしてdocker logsコマンドに提供できるように、stdoutまたはstderrにログを記録するにはphp-fpmが必要です。

私はこれを公式のnginx docker imageDockerfileからコピーしたアイデアです)でしようとしました:

# 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ログコレクターにロギングを機能させることができましたか?

回答:


24

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

/proc/self/fd/2

php5-fpm.log追加:

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

/dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0/dev/stdoutおよび/dev/stderrバリアントが存在する可能性があります。使用することを覚えておくのが簡単かもしれません/dev/stdin
CMCDragonkai

1
答えにエラーがあります-「access.log」ではなく「access_log」
です-rfay

2
あることが表示されますaccess.loggithub.com/docker-library/php/blob/...
CommandZ

13

公式のPHP fpmドッカーイメージの最新バージョンのfpm構成で焼き付けられたものは、標準ストリームに書き込むことに注意してください。

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

ありがとう、それは面白い。公式画像があることを知りませんでした
トム

1
どのドッカー画像を参照していますか?php:7-fpmを実行しましたが、エラーをログに記録していないようstderrです。
デレク

1

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

4
この解決策は質問で与えられ、質問者はそれが機能しないと述べました。たぶん、あなたは彼がそれを適切に動作させるために彼のdockerfileにロードする方法を指定したり、彼が彼のコンテナで実行できる他の診断をすることができますか?
アンドリュードマゼク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.