如何使用在模型类中使用Zend_Application_Resource_Log创建的Zend_Log实例

时间:2010-06-02 15:00:48

标签: zend-framework logging

我们的Zend_Log只通过向application.ini添加以下行来初始化

resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.mode = "a"

所以Zend_Application_Resource_Log将为我们创建实例。

我们已经能够通过以下方式在控制器中访问此实例:

public function getLog()
{
    $bootstrap = $this->getInvokeArg('bootstrap');

    //if (is_null($bootstrap)) return false;

    if (!$bootstrap->hasPluginResource('Log')) {
        return false;
    }
    $log = $bootstrap->getResource('Log');
    return $log;
}   

到目前为止,非常好。

现在我们想在模型类中使用相同的日志实例,我们无法访问引导程序。

我们的第一个想法是在Zend_Registry中注册相同的Log实例,以便能够在任何地方使用Zend_Registry :: get('Zend_Log'):

在我们的Bootstrap类中:

protected function _initLog() {      
    if (!$this->hasPluginResource('Log')) {
        throw new Zend_Exception('Log not enabled');
    }

$log = $this->getResource('Log');

    assert( $log != null);

    Zend_Registry::set('Zend_Log', $log);
}

不幸的是,这个断言失败==> $ log IS NULL ---但为什么??

很明显,我们可以在引导期间手动初始化Zend_Log而不使用Zend_Application_Resource_Log的自动化,因此不会接受这种答案。

2 个答案:

答案 0 :(得分:3)

这是最终的解决方案。我们基本上不应该调用函数_initLog()

非常感谢ArneRie!

// Do not call this function _initLog() ! 
protected function _initRegisterLogger() {
    $this->bootstrap('Log');

    if (!$this->hasPluginResource('Log')) {
        throw new Zend_Exception('Log not enabled in config.ini');
    }

    $logger = $this->getResource('Log');
    assert($logger != null);
    Zend_Registry::set('Zend_Log', $logger);
}

答案 1 :(得分:2)

此时可能没有引导,请尝试:

    try {
            $this->bootstrap('log'); // bootstrap log
            $logger = $this->getResource('log');
        } catch (Zend_Application_Bootstrap_Exception $e) {
            $logger = new Zend_Log();
            $writer = new Zend_Log_Writer_Null();
            $logger->addWriter($writer);
        }
        $registry = Zend_Registry::set('logger', $logger);