有没有更好的方法来拥有一个全局可访问的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');
我想这并不可怕。它看起来有点冗长。
答案 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);