首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ZF2中设置任意模块控制器的记录器对象?

如何在ZF2中设置任意模块控制器的记录器对象?
EN

Stack Overflow用户
提问于 2013-05-17 22:39:58
回答 3查看 1.3K关注 0票数 1

如何在ZEND-Framework2中配置和使用记录器?在应用程序引导中创建记录器对象是一种好方法吗?

EN

回答 3

Stack Overflow用户

发布于 2013-05-17 23:47:20

首先,您可以设置Service Manager Config:

代码语言:javascript
复制
'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;
    },
)

然后你可以在你的控制器中添加类似这样的东西

代码语言:javascript
复制
/**
 * 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);
}

请注意,参数的顺序被交换了,这只是为了减少控制器中的代码,使事情变得更简单。

如果你想在你的控制器中记录任何东西,你就有了一个快捷方式:

代码语言:javascript
复制
public function testAction()
{
    $this->_log('Testing');
}
票数 2
EN

Stack Overflow用户

发布于 2013-05-17 23:25:03

你应该看看Rob Allen在logging exceptions上的博客。他展示了如何在一个模块中使用ServiceManager工厂来实例化记录器和编写器。然后,您可以通过ServiceManager从任何其他有权访问它的类(如控制器)调用记录器。

票数 1
EN

Stack Overflow用户

发布于 2013-05-20 20:18:02

从Zend Framework2.2开始,只需在配置中设置以下行:

代码语言:javascript
复制
'log' => array(
    'Application\Log' => array(
        'writers' => array(
            array(
                'name'     => 'stream',
                'priority' => 1000,
                'options'  => array(
                    'stream' => 'data/logs/app.log',
                ),
            ),
        ),
    ),
),

在您的应用程序控制器中使用它:

代码语言:javascript
复制
 protected $log;

 public function getLog()
 {
     if (!$this->log) {     
        $sm = $this->getServiceLocator();
        $this->log = $sm->get('Application\Log');
     }
     return $this->log;
 }

阅读更多- zf2.2 release notes

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16611771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档