7 Stimmen

Wie man einen Zend registriert \Log Instanz im ServiceManager in ZF2

Ich frage mich, was der beste Weg ist, um eine Logger-Instanz über den ServiceManager in ZF2 zu initiieren und wiederzuverwenden. Natürlich kann ich eine einfache Methode tun, die in jeder Klasse verwendet werden kann, wie:

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

aber ich frage mich, was der beste Weg ist, um eine ähnliche Struktur in der global.php zu registrieren. Bis jetzt kann ich

Fügen Sie der Datei global.php Folgendes hinzu

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

Wenn ich versuche, es durch aufzurufen:

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

Ich bekomme eine :

Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Zend\Log

21voto

arturgrigor Punkte 9101

Fügen Sie die folgenden Daten in die Datei "global.php" ein

'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;
        },
    ),
),

Und dann können Sie anrufen

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

11voto

markus Punkte 39397

Alternativ, und eleganter, könnten Sie einen Log-Listener einrichten und den Logger von Ihrer Anwendung entkoppeln. Die EventManager ist eine sehr leistungsfähige Komponente und ZF2 ist jetzt im Grunde ein ereignisgesteuertes Framework.

In Ihrem module.php könnten Sie etwas hinzufügen wie:

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

Dann können Sie von überall, z.B. von einem Controller aus, etwas tun:

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

2voto

Manuel Punkte 8704

Verwenden Sie vielleicht die abstrakte Logger-Fabrik für die Konfiguration anstelle der normalen Fabrik

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',
                    ),
                ),
            ),
        ),
    ),
);

1voto

Thorsten Punkte 11

Bitte versuchen Sie es erneut mit dem absoluten Pfad \

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

1voto

Matthias Lill Punkte 308

Ich habe ein Standard-Datenbank-Writer-Objekt in meinem Bootstrap erstellt und es im ServiceManager registriert.

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

Der AbstractController ist eine Instanz von "ServiceLocatorAwareInterface". Ich kann also in meinem Controller einfach aufrufen

public function indexAction()
{
    ...

    $this->getServiceLocator()->get('Zend\Log')->info('this is a test log message');

    ...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X