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

3个月前 评论
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
1个月前 评论

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

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!