我正在尝试从我的 php docker 中获取错误日志。我发现 error.log 文件无处可去,因此修改了我的 dockerfile,如下所示:
FROM php:7.4-apache
RUN a2enmod rewrite
RUN docker-php-ext-install mysqli pdo pdo_mysql; \
docker-php-ext-enable mysqli pdo pdo_mysql;
# Redirect apache log files to stdout, see https://github.com/moby/moby/issues/19616
RUN ln -sf /proc/1/fd/1 /var/log/apache2/access.log
RUN ln -sf /proc/1/fd/1 /var/log/apache2/error.log
产生以下文件:
# ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 12 May 11 18:25 access.log -> /proc/1/fd/1
lrwxrwxrwx 1 root root 12 May 11 18:25 error.log -> /proc/1/fd/1
lrwxrwxrwx 1 www-data www-data 11 Nov 15 04:17 other_vhosts_access.log -> /dev/stdout
该部分现在正在工作:运行
echo "test" > /var/log/apache2/error.log
会将测试写入 docker 日志。另外,文件权限不受限制(请参阅https://stackoverflow.com/a/12566881/3519951)。
我添加了一个崩溃调用,
dfgdfga.test()
,但错误没有显示。如果我创建一个日志文件而不是重定向到 docker 输出,情况也是如此。它仍然是空的。
当我回顾这个问题时,我想通了。在这里分享,以防有帮助。
跑步
php -i | grep log
我发现了这个:
log_errors => Off => Off
在我看来,这是一个令人惊讶的默认设置,但足以解释日志的缺失。因此,我创建了一个小的 ini 文件(受本文启发),将其直接通过管道传输到 docker 日志:
; log PHP errors to a file. E_ALL=32767
log_errors = on
error_reporting = 32767
error_log = /proc/1/fd/1
并将其复制到 dockerfile 中,如下所示:
COPY logging.ini /usr/local/etc/php/conf.d/logging.ini
我在我的 php8-apache docker 容器中运行了这个,它为我修复了它。我可能应该先备份生产 php.ini。
cp“$PHP_INI_DIR/php.ini-development”“$PHP_INI_DIR/php.ini”
如果我正在构建一个新的,我会将其放入我的 DockerFile 中,并将 php.ini 复制到 php.ini-生产,然后再将开发版本复制到位。
在此更改之后,我的所有错误都以典型的 docker 方式出现。