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

Tom*_*Tom 26 logging php-fpm best-practices docker

我在 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
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 我可以将外壳放入容器中以查看日志。但是……这不是最佳实践。

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

我试图在Dockerfile(这是我从官方 nginx docker image复制的一个想法)中做到这一点:

# 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
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 看不到访问日志docker logs- 我想弄清楚为什么?在 docker 中使用 fpm 的其他人是否设法让日志记录工作到 docker 日志收集器?

Spy*_*dis 30

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

/proc/self/fd/2
Run Code Online (Sandbox Code Playgroud)

另外php5-fpm.log

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2
Run Code Online (Sandbox Code Playgroud)

  • 它似乎是`access.log`:https://github.com/docker-library/php/blob/6e600f59a4405b5066eb78f5f02180212dffd065/5.6/fpm/php-fpm.conf (5认同)
  • 相信这应该是 `php5-fpm.conf`,或者在更新的 PHP 上,`php-fpm.conf`。将这些指令添加到“.log”文件中不会执行任何操作:D (3认同)
  • 答案中有错误 - 它是“access_log”而不是“access.log” (2认同)

Dar*_*don 19

请注意,最新版本的官方PHP fpm docker 映像的烘焙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
Run Code Online (Sandbox Code Playgroud)

  • 你指的是哪个 docker 镜像?我运行了 php:7-fpm 并且它似乎没有将错误记录到 `stderr`。 (3认同)