docker 里面的 PHP 应用程序的日志如何输出标准输出(STDOUT)?

问题:docker 里面的 PHP 应用程序的日志如何输出标准输出(STDOUT)?
— 注:不是 php-fpm 的日志
环境:PHP 版本 7.1.13
测试 1:demo 程序如下:

$message = json_encode(array("key1"=>"message1","key2"=>"message2"),true);
$fp = @fopen('php://stdout','w');
fwrite($fp, $message);
fclose($fp);

在 docker 里面执行 php stdout.php 有输出,如下:

docker里面的PHP应用程序的日志如何输出标准输出(STDOUT)?
通过浏览器访问 stdout.php 文件,只有 nginx 的 access.log 日志,并没有输出上面的 json 信息

docker里面的PHP应用程序的日志如何输出标准输出(STDOUT)?

PHP 配置文件 /etc/php/7.1/fpm/pool.d/www.conf 也改成
catch_workers_output = yes;

测试 2:

$message = json_encode(array("key1"=>"message1","key2"=>"message2"),true);
file_put_contents('/data/www/stdout.log', $message,FILE_APPEND);

把 stdout.log 重定向的 /dev/stdout
ln -sf /data/www/stdout.log /dev/stdout 也是不行

请求社区大神们怎么解决此问题。

讨论数量: 3

你需要 php7.3

4年前 评论
sun-shell

Docker 中的 PHP 需要保证以下 3 个方面,方可实现输出日志到终端控制台

  1. php.ini 配置文件中设置 catch_workers_output = yes;
  2. php 使用 file_put_contents 函数方法结合 php 输出流 php://stdout
    比如下面这个例子:
    $message = json_encode(array("key1"=>"message1","key2"=>"message2"),true); file_put_contents('php://stdout', $message,FILE_APPEND);
  3. 保证你的 php 运行程序在前台执行,比如 php-fpm 运行的 php 程序,需要 php-fpm 在 docker 中保持前台运行
    php-fpm --nodaemon -R
4年前 评论

发现 7.3 输出终端其实会带了 “WARNING: [pool www] child 88 said into stdout” 字段,一般收集只支持 json 格式的标准输出。我用另外一种方式实现,就是启动容器时候,直接 tail 日志文件到标准输出,就可以收集了。不用升级 PHP 版本,不用改动业务逻辑代码。生产运行 1,2 个月稳定正常。

4年前 评论