我有一个docker容器中的php-fpm,在Dockerfile我编辑fpmconfiguration文件( /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日志采集器时 – 我需要php-fpmlogin到stdout或stderr,因此docker可以捕获它们并将它们提供给docker logs命令。
我试图在Dockerfile这样做(这是我从官方的nginx Dockerfile复制的):
# 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中是否有其他人使用fpmpipe理日志工作到docker日志采集器?
好的方法是将错误和访问日志发送到以下地址:
/proc/self/fd/2
所以在你的php5-fpm.log添加:
access.log = /proc/self/fd/2 error_log = /proc/self/fd/2
请注意,在官方PHP fpm docker映像的最新版本的fpm config中烘焙写入标准stream:
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