Monolog:捕获错误/异常并在响应中输出消息的处理程序(根据 PHP 默认)

Posted

技术标签:

【中文标题】Monolog:捕获错误/异常并在响应中输出消息的处理程序(根据 PHP 默认)【英文标题】:Monolog: Handler to catch errors/exceptions and output the messages in the response (as per PHP default) 【发布时间】:2015-12-18 03:41:16 【问题描述】:

如何配置 Monolog 以在响应中输出 php 错误,就像没有 Monolog 一样?

我想要做的是,例如,当 PHP 页面中发生 PHP E_ERROR 时,该错误消息将输出到响应中,并传递给为 Monolog 设置的任何其他处理程序。

AFAIK,我可能会使用 StreamHandler 并将其输出到标准输出,但不知道如何执行此操作或它是否会按预期工作?

我想选择以下两种变体:

    Monolog 在将错误消息输出到响应中之前重新格式化它 Monolog 将错误(或异常)转发回 PHP 本地错误处理,以便它在响应中以相同格式输出消息,就好像 Monolog 没有调解它一样

我怎样才能实现这些?我什至不知道如何让 Monolog 将自己注册为异常和错误的处理程序。我是否需要编写自己的函数来传递给register_error_handler()register_exception_handler()register_shutdown_function()

【问题讨论】:

【参考方案1】:

短版:

use Monolog\ErrorHandler;
$logger = new Logger('Logger Name');

ErrorHandler::register($logger);

更长、更可定制的版本:

use Monolog\ErrorHandler;

$logger = new Logger('Logger Name');

$handler = new ErrorHandler($logger);
$handler->registerErrorHandler([], false);
$handler->registerExceptionHandler();
$handler->registerFatalHandler();

【讨论】:

已经实现了你的解决方案,但我遇到了一些问题。请看我的问题***.com/questions/43665088/… 这适用于记录 php 错误,但不保留在响应中输出 PHP 错误的正常 php 功能。还有什么我应该做的吗? 其实是的。确保 registerErrorHandler 的 sedond 参数为 TRUE。如果为 false,则不会调用 PHP 错误处理程序。忘记我在下面的回复......【参考方案2】:

我还想保留默认行为,即响应中的错误消息。仅仅接收空白页(至少在 Monolog 1 和 PHP 7.2 中会发生)不是很直观,至少在开发过程中是这样。我的解决方案是添加以下处理程序:

$log->pushHandler(new Monolog\Handler\StreamHandler("php://output", Monolog\Logger::ERROR));

【讨论】:

以上是关于Monolog:捕获错误/异常并在响应中输出消息的处理程序(根据 PHP 默认)的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的异常“PDOException”消息“无效的数据源名称”

PHP/MongoDB 错误:未捕获的异常“MongoCursorException”

如何向 Symfony/Monolog 日志输出添加附加信息(主机、URL 等)?

在Response.Flush()之后捕获500个错误

Symfony2 Monolog 配置为使用 raven 处理程序(Sentry)

致命错误:未捕获的异常 PAYPAL