Docker容器中没有来自php-fpm的错误日志

17

作为 Docker-Compose 中使用 Apache + PHP-FPM 容器的用户,我发现 PHP-FPM 容器无法显示任何错误信息。

docker-compose.yml

version: '3'

services:
  php:
    build:
      context: ./php
    ports:
      - 9000:9000
    volumes:
      - ./code:/code
      - ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf
    environment:
      ENVIRONMENT: local
  web:
    image: httpd:2.4
    depends_on:
      - php
    ports:
      - 80:80
    volumes:
      - ./code:/usr/local/apache2/htdocs
      - ./web/httpd.conf:/usr/local/apache2/conf/httpd.conf
    depends_on:
      - php

php-fpm Docker文件:

FROM php:5.6-fpm 

php-fpm www.conf:

[global]
error_log = /proc/self/fd/2

[www]

user = www-data
group = www-data

listen = nginx:9000

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

; Logging

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

clear_env = no

; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes

php_flag[display_errors] = on
php_admin_flag[log_errors] = on
;php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
php_admin_value[display_startup_errors] = on

docker-compose logs 命令只显示 php-fpm 的访问日志,没有错误日志。

尝试了所有在此帖子中提出的可能重复的解决方案:PHP-FPM doesn't write to error log,但是它们都对我无效,请查看下面我的评论。


1
那个海报没有使用Docker吗? - syst0m
个人而言,我会在php.ini conf.d中的vhosts.ini文件中指定我的错误日志位置。我没有遇到任何问题,我正在使用与您相同的图像的php 7.2版本。您可以通过“ssh”进入容器docker exec -it {php container name} bash并运行所有必要的命令/测试来检查您的配置文件是否已生效。 - Shardj
我已经有了这个指令 "catch_workers_output = yes"。请检查我发布的 www.conf 文件。 - syst0m
此外,容器内没有 /var/log/upstart/php5-fpm.log。 - syst0m
下一个评论中,使用touch命令手动创建错误日志文件在这里不适用,因为error_log被重定向到stderr,error_log = /proc/self/fd/2。而且我已经在www.conf中有php_admin_flag [log_errors] = on指令。 - syst0m
显示剩余6条评论
3个回答

2
在我的情况下,导致问题的是/usr/local/etc/php-fpm.d/docker.conf文件:
[global]
error_log = /proc/self/fd/2

; https://github.com/docker-library/php/pull/725#issuecomment-443540114
log_limit = 8192

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

clear_env = no

; Ensure worker stdout and stderr are sent to the main error log.
catch_workers_output = yes
decorate_workers_output = no

error_log 指令的值为 /proc/self/fd/2,导致日志被写入到运行 docker-compose up 的终端/控制台中。

我只需要在 /usr/local/etc/php-fpm.d/ 目录下创建一个自定义全局 fpm 配置文件,并将其命名为 zz-global.conf,使其作为最后一个执行,以覆盖 docker.conf 的值。然后,我只需要将 error_log 的值设置为 php-fpm 容器内的自定义路径,例如:

[global]
error_log = /var/www/logs/php-fpm-error.log

就是这样了。

可能值得一提的是:我的php.ini文件(修改后的php.ini-development)具有以下自定义错误日志记录相关值:

; https://dev59.com/SGoy5IYBdhLWcg3wPbyd#10546138
; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
catch_workers_output = yes
php_admin_flag[log_errors] = on
php_admin_flag[display_errors] = on
php_admin_value[error_reporting] = E_ALL
php_admin_value[error_log] = /var/log/error.log
access.log = /var/www/logs/php-fpm-access.log


1
错误日志应该像 OP 想要的那样进入容器的 stdout/stderr,将日志写入普通文件并不是问题的解决方案。 - istepaniuk
我从原帖中看不到任何关于日志输出位置的明确偏好。就我理解问题而言,它是关于能否查看任何错误信息。我不确定为什么你要强调你个人的观点作为非常重要的视角。尽管原帖作者的想法和你一样,但我的答案可能仍然指向了正确的方向。 - FullStack Alex
如果我没有表达清楚,我很抱歉,这不是关于偏好的问题。OP说:“docker-compose logs只显示php-fpm访问日志,没有错误日志”。他们确实想要stdout上的日志,而不是文件中的日志。 - istepaniuk

2

我花了几个小时努力让它工作。

在文件docker-compose.yml中,我挂载了我的日志(以便它们持久存在)。

        volumes:
        - ./phpSettings.conf:/usr/local/etc/php-fpm.d/zzz-phpSettings.conf
        - ./logs/php-error.log:/var/log/error.log
        - ./logs/php-access.log:/var/log/access.log

phpSettings.conf文件中,我有以下内容:
[www]
user = www-data
group = www-data
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

catch_workers_output = yes
php_admin_flag[log_errors] = on
php_admin_flag[display_errors] = off
php_admin_value[error_reporting] = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED
php_admin_value[error_log] = /var/log/error.log
access.log = /var/log/access.log
php_value[memory_limit] = 512M
php_value[post_max_size] = 24M
php_value[upload_max_filesize] = 24M

请确保在启动docker之前存在已挂载的日志文件。
关键是将我的设置命名为“zzz-phpSettings.conf”,以便最后加载。我使用相同的设置覆盖了默认的docker php镜像www.conf设置(除了监听0.0.0.0:9000)。
在这个php-fpm + Nginx设置中,我成功地将nginx(错误/访问)日志记录到自己的位置+php-fpm错误/访问日志也记录到自己的位置,因此日志记录看起来非常好。

这个方法可以将日志输出到持久化文件中,但是Docker的日志驱动程序并不知道它。最初的问题陈述是“docker-compose logs”没有显示错误日志。有什么解决办法吗? - emmdee
我的Docker Compose使用此设置显示日志,Apache错误日志被定向到所提到的文件。另外,我不同意这个问题是关于在Docker Compose中查看日志的。 - mrbarletta
问题明确指出:“docker-compose logs仅显示php-fpm访问日志,没有错误日志。”因此尝试在docker日志驱动程序中获取错误日志。如果您有任何建议,我会很感激,也会尽力自己解决这个问题。 - emmdee
并且还说:尝试了在帖子中提出的所有可能重复的解决方案,包括将日志写入文件,表明他对此感到满意,不仅仅是寻找docker compose日志。 :P - mrbarletta

0
在我的情况下,这是一个调用php脚本的操作。
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
ini_set('display_errors', ...);
ini_set('log_errors', ...);
ini_set("error_log", ...);

有时候你也需要检查你的php文件,因为它可能会覆盖全局的php设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接