密切关注您的ZF应用程序时,通常很难将应用程序错误与一般PHP错误分开,如果您将它们聚集在与Web服务器错误相同的位置,这会变得更加困难。
此外,PHP的错误报告不提供大量上下文,即使在报告未捕获的异常时也是如此—通常您只会收到一条神秘的异常消息,以及发出它的文件和行。
ZendServer的Monitor扩展具有一些提供更多上下文的功能,并且默认情况下会执行其中的大部分操作:记录错误时可用的请求和环境设置、提供的函数名称和参数,以及可供您检查的完整回溯。此外,Monitor扩展包含一个API,允许您触发自定义Monitor事件,并且您可以在执行此操作时提供额外的上下文——例如传递对象或数组,这可能有助于在调试时提供上下文。
为了配合此功能,我们开发了一个新的Zend_Log
编写器,Zend_Log_Writer_ZendMonitor
,它将发出此类自定义事件。此外,对Zend_Log
API进行了一些修改,以允许将额外的上下文信息传递给日志编写器。
例如,您可以执行以下操作:
$log = new Zend_Log(new Zend_Log_Writer_ZendMonitor()); $log->crit('Exception occurred processing login', $e); // or: $log->crit('Exception occurred processing login', array( 'request' => $request, // Request object 'exception' => $e, // Exception ));
然后ZendServer的GUI将显示一个选项卡“Custom”,其中包括传递的额外参数;默认情况下,如果只传递一个对象,信息将在键“info”下返回。传递关联数组非常有用,因为它允许您提供详细的上下文信息。
此功能的一个用例是通过ErrorController
报告应用程序异常。这可以通过您的ZendServerGUI提供一些很好的反馈;您可以根据“自定义事件”的“规则名称”进行过滤,并进一步根据严重性等标准来确定您的应用程序何时以及为何触发ErrorController
—并希望减少此类事件的发生。
我们认为这可能是一个很好的默认用例,并在Zend_Tool
中围绕它提供了一些代码生成。ErrorController
现在将检查日志资源是否可用,如果可用,则写入它。
为了实现这一点,我们还编写了一个新的Log引导程序资源,它搭载了一些额外的新功能:Zend_Log
中的一个新的factory()
方法。这允许您从配置创建Zend_Log
实例,使用一个或多个编写器和配置的过滤器。通过ErrorController
启用ZendMonitor日志记录现在就像在您的配置中添加一行一样简单:
resources.log.zendmonitor.writerName = "ZendMonitor"
注意:您可以记录到任何记录器,如果需要,也可以记录到多个记录器。
如果在您的控制器中,您想要记录其他事件,您可以通过简单地获取引导程序对象然后获取日志资源来实现:
$bootstrap = $this->getInvokeArg('bootstrap') if ($bootstrap->hasResource('Log')) { $log = $bootstrap->getResource('Log'); $log->info(/* ... */); }
这种简单的集成为使用ZendServer的ZendFramework用户带来了一些奇妙的好处,而且实现起来非常便宜(当Monitor扩展不存在时,ZendMonitor记录器充当空记录器)。您还能找到哪些其他用途?
注意:此功能现在可通过主干中的ZendFramework颠覆存储库使用。它将在即将发布的1.10版本的稳定版本中提供。
更新:我想指出的是,bootstrap资源是由两个ibuildings贡献者MartinRoest和MarkvanderVelden贡献的,他们贡献的代码使实例化成为可能通过新的factory()
方法记录实例。