php - 如何让 MonoLog 的 ErrorHandler 输出到 stdout?

标签 php shell stdout monolog

我对使用 MongoLog 将日志发送到标准输出有点困惑。我正在使用这段代码:

# console/proxy-server.php
require_once '../vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\ErrorLogHandler;

// This is for test - it *definitely* goes to stdout!
echo "Hello";

// Here is the logger
$logger = new Logger('stdout');
$logger->pushHandler(new ErrorLogHandler());
$logger->info('Logging');

日志行确实输出到我运行程序的控制台,但它似乎不会输出到真正的标准输出。但是,echo 中的“Hello”工作正常。

我从 shell 脚本启动它:

#!/bin/sh

# Write to both stdout and a log file
php console/proxy-server.php | tee --append proxy.log

如果我在另一个控制台中使用 tail -f proxy.log ,那么 echo 消息会实时弹出,但我感兴趣的日志不会(甚至如果我干净地退出脚本,尽管我希望它们也能实时附加)。但是,两组输出都输出到我运行脚本的控制台。

这种实现方式was sourced from this blog article .

更新

在博客文章评论中,有一个使用 StreamHandler 的替代解决方案,如下所示。除了更改了 pushHandler() 行之外,与上面相同:

use Monolog\Handler\StreamHandler;

...

$logger->pushHandler(new StreamHandler("php://stdout"));

这个tee记录的,所以看起来有些标准输出比其他标准输出更平等!我想知道是否实际上有很多标准输出,而 tee 只记录“真实”的输出?就 shell 管道而言,这两种方法有什么区别?

最佳答案

我还没有对此进行测试,因为我的替代解决方案与 tee 配合得很好。然而,最近我怀疑 ErrorLogHandler 实际上将输出发送到 stderr,而不是 stdout,这就是为什么 tee > 不渲染它。

如果其他人遇到这个问题,我应该对他们的观察感兴趣。在某些方面,这是一种边缘情况,因为在大多数情况下,错误输出以与非错误输出相同的方式呈现到控制台,并且通常无法区分。

关于php - 如何让 MonoLog 的 ErrorHandler 输出到 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710208/

相关文章:

linux - 如何在 Linux shell 中执行 'where' 子句?

bash - 如何从文件名中获取字符串并将其用作参数

php - 如何在mysql中选择未知数量的列?

php - 无法使用laravel检索GET参数

php - Laravel 获取所有具有类别的记录

linux - 如何在linuxexpect脚本中传递perl形式的参数?

linux - 如何将输出重定向到文件和标准输出

.net - 使用 .net 从子进程重定向标准输出

ssh - 可以调用 printf() 阻塞吗?

php exec 返回的结果少于直接进入命令行的结果