无法使用docker查看STDERR输出

时间:2017-05-30 05:25:56

标签: php apache docker stderr

我正在运行一个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的答案。

3 个答案:

答案 0 :(得分:4)

我无法重现您的情况。如果以下内容无效,请提供mcve您的错误。

基本D​​ockerfile:

$ 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)

在我的情况下,我错过了这个神奇的设置(&#34;没有&#34;默认情况下):

{{1}}

Symfony logs to stdout inside Docker container

找到它