如何在ZEND-Framework2中配置和使用记录器?在应用程序引导中创建记录器对象是一种好方法吗?
发布于 2013-05-17 23:47:20
首先,您可以设置Service Manager Config:
'factories' => array(
'Zend\Log\Logger' => function($sm){
$logger = new \Zend\Log\Logger;
$writer = new \Zend\Log\Writer\Stream('./data/log/'.date('Y-m-d').'-error.log');
$logger->addWriter($writer);
return $logger;
},
)然后你可以在你的控制器中添加类似这样的东西
/**
* Get the logger
*
* @return \Zend\Log\Logger
*/
protected function _getLog()
{
if($this->_log == NULL) {
$this->_log = $this->getServiceLocator()->get('Zend\Log\Logger');
}
return $this->_log;
}
/**
* Shortcut for logging method.
* Swapped parameter order to save code inside controllers.
*
* @param mixed $message
* @param int $priority
* @param array|Traversable $extra
* @return Logger
* @throws Exception\InvalidArgumentException if message can't be cast to string
* @throws Exception\InvalidArgumentException if extra can't be iterated over
* @throws Exception\RuntimeException if no log writer specified
*/
protected function _log($message, $priority = \Zend\Log\Logger::DEBUG, $extra = array())
{
return $this->_getLog()->log($priority, $message, $extra);
}请注意,参数的顺序被交换了,这只是为了减少控制器中的代码,使事情变得更简单。
如果你想在你的控制器中记录任何东西,你就有了一个快捷方式:
public function testAction()
{
$this->_log('Testing');
}发布于 2013-05-17 23:25:03
你应该看看Rob Allen在logging exceptions上的博客。他展示了如何在一个模块中使用ServiceManager工厂来实例化记录器和编写器。然后,您可以通过ServiceManager从任何其他有权访问它的类(如控制器)调用记录器。
发布于 2013-05-20 20:18:02
从Zend Framework2.2开始,只需在配置中设置以下行:
'log' => array(
'Application\Log' => array(
'writers' => array(
array(
'name' => 'stream',
'priority' => 1000,
'options' => array(
'stream' => 'data/logs/app.log',
),
),
),
),
),在您的应用程序控制器中使用它:
protected $log;
public function getLog()
{
if (!$this->log) {
$sm = $this->getServiceLocator();
$this->log = $sm->get('Application\Log');
}
return $this->log;
}阅读更多- zf2.2 release notes
https://stackoverflow.com/questions/16611771
复制相似问题