更好地实现全局Zend Log实例?

时间:2010-01-13 19:24:38

标签: php zend-framework

有没有更好的方法来拥有一个全局可访问的Zend_Log对象?

在Bootstrap.php中我正在做:

protected function _initLogging()
{
    $logger = new Zend_Log();
    $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../app.log');
    $logger->addWriter($writer);
    Zend_Registry::set('log', $logger);
}

然后在整个申请中我将使用:

Zend_Registry::get('log')->debug('hello world');

我想这并不可怕。它看起来有点冗长。

3 个答案:

答案 0 :(得分:5)

引用此newsgroup entry

class My_Helper_Logger extends Zend_Controller_Action_Helper_Abstract
{
  function init()
  {
    $this->getActionController()->logger = $this->getActionController()
                                                  ->getInvokeArg('bootstrap')
                                                    ->getResource('logger');
  }
}
  

应用帮助程序所有你需要做的就是放入init()   迈克尔的例子这一行的功能:

Zend_Controller_Action_HelperBroker::addHelper(new My_Helper_Logger());
  

现在您可以在控制器的每个操作中访问记录器   as $ this-> logger

还有许多其他建议,请查看链接。

答案 1 :(得分:1)

你可以将它包装在'经理类'中:

class My_Log_Manager
{
  static $_instance = null;
  protected $_logInstance = null;

  public static function getInstance(){}
  public function getLogInstance(){}
  public static function log($level, $msg)
  {
     self::getInstance()->_logInstance->$level($msg);
  }
}

然后你可以设置静态方法,无论你想要像catchall例子,还是通过实现__call或其他任何东西。那么你可以像My_Log_Manager::<methodName>()那样在那个类上调用静态方法。

答案 2 :(得分:1)

您可以尝试跳过addWriter()删除一行:

$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../app.log');  
$logger = new Zend_Log($writer);  
Zend_Registry::set('log', $logger);