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 等)?