How to register an instance of Zend \ Log in the ServiceManager in ZF2

I am wondering what is the best way to start and reuse a log instance through the ServiceManager in ZF2. Of course, I can make a simple method for use in any class, for example:

public function getLogger () { $this->logger = new Logger(); $this->logger->addWriter(new Writer\Stream('/log/cms_errors.log')); return $logger; } 

but I was wondering what is the best way to register a similar structure in global.php. While i can

add to global.php

following:
 'Zend\Log'=>array( 'timestampFormat' => 'Ym-d', array( 'writerName' => 'Stream', 'writerParams' => array( 'stream' => '/log/zend.log', ), 'formatterName' => 'Simple', ), ), 

If I try to call it via:

 $this->getServiceLocator()->get('Zend\Log') 

I get:

 Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log 
+7
source share
5 answers

Add the following data to the file '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; }, ), ), 

And then you can call

 $this->getServiceLocator()->get('Zend\Log')->info('Something...'); 
+20
source

Alternatively, and more elegantly, you can set up a log listener and disconnect your logger from your application. EventManager is a very powerful component, and ZF2 is basically an event driven platform.

In your module.php you can add something like:

 // 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); }); 

Then from anywhere, for example. from the controller you can:

 $this->getEventManager()->trigger('log', $this, array( 'priority' => 7, 'message' => 'some log message' )); 
+11
source

Maybe use abstract factory logger for configuration instead of regular factory

http://framework.zend.com/manual/2.2/en/modules/zend.mvc.services.html#zend-log-loggerabstractservicefactory

 return array( 'log' => array( 'Log\App' => array( 'writers' => array( array( 'name' => 'stream', 'priority' => 1000, 'options' => array( 'stream' => 'data/logs/app.log', ), ), ), ), ), ); 
+2
source

Try again using the absolute path \

 $writer = new \Zend\Log\Writer\Stream('log.log'); $logger = new \Zend\Log\Logger($writer); 
+1
source

I created the default database record object in my bootstrap and registered it with the ServiceManager.

 public function onBootstrap(MvcEvent $e) { ... $serviceManager = $e->getApplication()->getServiceManager(); $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter'); $writer = new \Zend\Log\Writer\Db($dbAdapter, 'log_database_table'); $logger = new \Zend\Log\Logger(); $logger->addWriter($writer); // this is optional but nice to have \Zend\Log\Logger::registerErrorHandler($logger); $serviceManager->setService('Zend\Log', $logger); } 

AbstractController is an instance of "ServiceLocatorAwareInterface". So I can just call the controller

 public function indexAction() { ... $this->getServiceLocator()->get('Zend\Log')->info('this is a test log message'); ... } 
+1
source

All Articles