Al-*_*unk 7 zend-framework zend-log zend-framework2
我想知道通过ZF2中的ServiceManager启动和重用logger实例的最佳方法是什么.当然,我可以在任何类中使用一种简单的方法,例如:
public function getLogger () {
$this->logger = new Logger();
$this->logger->addWriter(new Writer\Stream('/log/cms_errors.log'));
return $logger;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道在global.php中注册类似结构的最佳方法是什么.到目前为止,我可以
将以下内容添加到global.php中
'Zend\Log'=>array(
'timestampFormat' => 'Y-m-d',
array(
'writerName' => 'Stream',
'writerParams' => array(
'stream' => '/log/zend.log',
),
'formatterName' => 'Simple',
),
),
Run Code Online (Sandbox Code Playgroud)
如果我尝试通过以下方式调用它:
$this->getServiceLocator()->get('Zend\Log')
Run Code Online (Sandbox Code Playgroud)
我得到一个:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log
Run Code Online (Sandbox Code Playgroud)
art*_*gor 20
将以下数据添加到'global.php'
'service_manager' => array(
'factories' => array(
'Zend\Log' => function ($sm) {
$log = new Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream('./data/logs/logfile');
$log->addWriter($writer);
return $log;
},
),
),
Run Code Online (Sandbox Code Playgroud)
然后你就可以打电话了
$this->getServiceLocator()->get('Zend\Log')->info('Something...');
Run Code Online (Sandbox Code Playgroud)
mar*_*kus 11
或者,更优雅的是,您可以设置日志监听器并使您的记录器与您的应用程序分离.这EventManager是一个非常强大的组件,ZF2现在基本上是一个事件驱动的框架.
在你的module.php你可以添加如下内容:
// Setup the Zend Logger, pseudocode
$logger = new Logger;
$writer = new Writer;
$logger->addWriter($writer);
// Attach a logging listener for the log event on application level, working code
$events = StaticEventManager::getInstance();
$events->attach('*', 'log', function($event) use ($logger) {
$target = get_class($event->getTarget());
$message = $event->getParam('message', 'No message provided');
$priority = (int) $event->getParam('priority', Logger::INFO);
$message = sprintf('%s: %s', $target, $message);
$logger->log($priority, $message);
});
Run Code Online (Sandbox Code Playgroud)
然后从任何地方,例如从Controller,您可以:
$this->getEventManager()->trigger('log', $this, array(
'priority' => 7,
'message' => 'some log message'
));
Run Code Online (Sandbox Code Playgroud)