我正在运行一个php docker镜像(php:5.6-apache),它有apache的错误,访问日志分别使用符号链接重定向到STDERR和STDOUT。
当我在前台运行docker镜像或访问docker容器日志时,我可以看到STDOUT输出。但我没有看到任何错误(即使我生成php错误)。
知道为什么会这样,以及如何解决它?
我正在为Mac运行docker(但我认为这没有任何区别)
由于
access.log -> /dev/stdout
error.log -> /dev/stderr
other_vhosts_access.log -> /dev/stdout
编辑/解决:
正如@BMitch在下面提到并证明的那样,STDERR重定向工作正常。
问题出在PHP配置上。如果我使用error_log()
记录错误,它将输出到日志。但是如果我有一个php错误,比如调用一个未定义的函数,错误将永远不会出现在日志中。这似乎有点不一致。无论如何,......
我必须在php.ini
中创建一个/usr/local/etc/php/
文件并添加以下两个参数:
log_errors = On
error_log = /var/log/apache2/error.log
然后重新启动docker容器。这导致所有PHP错误被记录并输出到STDERR。请参阅@ German的答案。
答案 0 :(得分:4)
我无法重现您的情况。如果以下内容无效,请提供mcve您的错误。
基本Dockerfile:
$ cat Dockerfile
FROM php:5.6-apache
COPY . /var/www/html/
唯一的php就是这个文件生成错误:
$ cat error.php
<?
error_log("Hello error log.")
?>
构建并运行它:
$ docker build -t test-php .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM php:5.6-apache
---> f16436448ebd
Step 2/2 : COPY . /var/www/html/
---> Using cache
---> cfe66485e2cc
Successfully built cfe66485e2cc
Successfully tagged test-php:latest
$ docker run -p 8080:80 -d --name test-php test-php
7f9a1836a8157963966b583579dff94c6413292547b84d22957add77ad2d8e14
Curl按预期为空,但调用它会在日志中生成错误:
$ curl localhost:8080/error.php
显示stdout日志,将错误重定向到/ dev / null:
$ docker logs test-php 2>/dev/null
172.17.0.1 - - [31/May/2017:00:06:37 +0000] "GET /error.php HTTP/1.1" 200 174 "-" "curl/7.38.0"
显示stderr日志,将stdout重定向到/ dev / null
$ docker logs test-php >/dev/null
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Wed May 31 00:06:25.064546 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.30 configured -- resuming normal operations
[Wed May 31 00:06:25.064584 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
[Wed May 31 00:06:37.833470 2017] [:error] [pid 17] [client 172.17.0.1:50040] Hello error log.
请注意错误输出的最后一行。
答案 1 :(得分:3)
如果你想在apache2日志中看到php错误,你必须激活它们。为此,您必须将php.ini
文件写入文件夹/usr/local/etc/php
。
我在存储库中编写了一个示例,以便可以看到示例。
https://github.com/nitzap/stackoverflow-docker-php-error-log
如果要查看stdout和stderr日志,可以使用以下命令在容器外部执行此操作:
docker logs <name_container>
现在,如果你想在日志中保持附加,你可以像在tail命令中那样添加-f选项。
docker logs <name_container> -f
答案 2 :(得分:1)