题 如何在docker容器中运行时让php-fpm登录到stdout / stderr


我有一个docker容器中的php-fpm和 Dockerfile 我编辑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

这很好 - 我可以在容器中找到一个shell来查看日志。但是......这不是最好的做法。

问题是当我尝试使用时 码头日志收集器  - 我需要php-fpm登录到stdout或stderr,这样docker就可以捕获它们并将它们提供给 docker logs 命令。

我试着这样做 Dockerfile (这是我从中复制的一个想法 官方nginx码头图像):

# 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日志收集器?


12
2018-01-09 11:56






答案:


好的,这样做的方法是将错误和访问日志发送到以下地址:

/proc/self/fd/2

php5-fpm.log 加:

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

19
2018-01-21 15:48



我尝试了这个解决方案并且它有效,谢谢。 - Tom
它有可能存在 /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0,和 /dev/stdout 和 /dev/stderr 变种。可能更容易记住使用 /dev/stdin。 - CMCDragonkai
答案中有错误 - 它是“access_log”而不是“access.log” - rfay
它似乎是 access.log: github.com/docker-library/php/blob/... - CommandZ


注意烘烤中 fpm配置 最新版本的官方 PHP fpm docker图片 写入标准流:

error_log = /proc/self/fd/2

...

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

10
2017-11-24 01:41



谢谢,这很有趣。我不知道现在有官方形象 - Tom


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
2017-12-17 22:51



这个解决方案在问题中给出,并且提问者表示它不起作用。也许您可以指定他如何在dockerfile中加载它以使其正常工作或他可以在其容器上执行的其他诊断? - Andrew Domaszek