代码之家  ›  专栏  ›  技术社区  ›  Chris

更好地实现全局Zend_日志实例?

  •  3
  • Chris  · 技术社区  · 14 年前

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

    在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 回复  |  直到 12 年前
        1
  •  5
  •   Gordon Haim Evgi    14 年前

    从这个引用 newsgroup entry :

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

    要应用助手,您所要做的就是放入init()。 Michael示例的函数,此行:

    Zend_Controller_Action_HelperBroker::addHelper(new My_Helper_Logger());
    

    在控制器的每一个动作中,现在你都可以访问记录器 作为$this->记录器

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

        2
  •  1
  •   prodigitalson    14 年前

    好吧,你可以把它包装在“经理班”里:

    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 或者什么。然后您可以jsut调用类上的静态方法,比如 My_Log_Manager::<methodName>() .

        3
  •  1
  •   Corey Ballou    14 年前

    你可以尝试跳过 addWriter() 要删除单行:

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