Logger in Zend Framework 2 über Modul Config erstellen

Wer das Zend Framework kennt wird vermutlich auch schon Kontakt mit Zend\Log und dem Thema logging gehabt haben. Mit dem ZF2 wurden viele Dinge verändert und auch der Logger blieb davon nicht verschont. Leider lässt aber die Dokumentation aktuell noch zu wünschen übrig. Wer eine Logger-Instanz über die Modul-Config (modul.config.php) erstellen will, wird vermutlich das gleiche Problem wie ich bekommen, dass man keine wirklichen Informationen dazu findet. Die Optionen für ein Config-Array sind einfach nicht ausreichend erklärt oder überhaupt aufgeführt.

Nachdem ich die diversen Dateien aus dem Zend\Log durchgesehen habe, konnte ich weitgehend die Konfiguration nachstellen. Somit ist es im Endeffekt leicht möglich eine Instanz des Loggers komplett in der Konfigurationsdatei zu erstellen, ohne irgendwelche Einstellungen hardcoded abzulegen; wenn man weiß wie. :)

Das Konfigurations-Array

Das folgende Array zeigt alle (von mir gefundenen) Konfigurationsmöglichkeiten für Logger. Ob dieses nun in der Modul Config abgelegt, oder direkt an \Zend\Log\Logger übergeben wird, spielt dabei keine Rolle. Die Klasse kann dieses verarbeiten und erstellt ohne weiteres Zutun die Instanz anhand dieser Einstellungen. Die meisten Angaben sind dabei optional. Wenn man Filter oder Formatter beispielsweise nicht benötigt, können die Nodes einfach weggelassen werden.

array(
    'name' => 'exceptions',

    // Wenn 'true' werden über diesen Logger automatisch Fehler 
    // und/oder Ausnahmen erfasst
    'exceptionhandler' => true,
    'errorhandler' => false,

    // Es kann eine beliebige Anzahl von Log-Writer für den Logger
    // als Arrays angegeben werden
    'writers' => array(
        array(
            // Der Name ist die Klasse des Writers. Die Zend eigenen Writer
            // können als shorthand angegeben werden, bei eigenen muss der
            // komplette Namespace-Pfad angegeben werden.
            // Beispiel: 'Stream' == '\Zend\Log\Writer\Stream'
            'name' => 'Stream',

            // Über die Priorität kann die Reihenfolge von Writern gesteuert
            // werden, falls mehrere einem Logger zugewiesen sind.
            'priority' => 1,

            // Die Optionen für den Writer finden wieder unter 'options' Platz
            'options' => array(
                'stream' => '/data/log/exceptions.log',

                // Ein Formatter kann hier angegeben werden. Der Name ist, 
                // wie oben, wieder für die Zend Formatter als shorthand 
                // anzugeben oder der komplette Pfad zu eigenen Formattern.
                // Beispiel: 'Simple' == '\Zend\Log\Formatter\Simple'
                'formatter' => array(
                    'name'   => 'Simple',

                    // Der Formatter wird ebenfalls über 'options' konfiguriert
                    'options' => array(
                        'format' => '%timestamp% %priorityName%: %message%',
                        'dateTimeFormat' => 'Y-m-d H:i:s',
                    ),
                ),

                // Ein Writer kann eine beliebige Anzahl von Filtern haben.
                // Wie oben werden auch hier im Namen die Klasse des Filters
                // angegeben, als shorthand oder Pfad mit Namespace.
                'filters' => array(
                    array(
                        'name' => 'Priority',

                        // Die Optionen können sich für verschiedene Filter
                        // ändern, werden aber immer unter 'options' angegeben
                        'options' => array(
                            'priority' => \Zend\Log\Logger::ERR,
                            'operator' => '<=',
                        ),
                    ),
                ),
            ),
        ),
    ),
),

Einen Logger über die Factory erstellen

Im Log-Modul von Zend findet sich noch die LoggerServiceFactory. Diese kann eine einzelne Instanz eines Loggers automatisch erstellen. Legt man in einer Modul Config ein Array unter dem Key log ab, so wird dieses automatisch über die Factory instanziiert, wenn man diese im ServiceManager hinterlegt:

'service_manager' => array(
    'factories' => array(
        'logger' => 'Zend\Log\LoggerServiceFactory',
    ),
),

'log' => array(
    'name' => 'logger',
    /* [...] */
),

Danach kann man sich über den ServiceManager die Instanz holen und direkt verwenden:

$this->getServiceLocator()
     ->get('logger')
     ->info('Das ist ein automatisch erstellter Logger!');

Erweiterte Möglichkeiten

Die LoggerServiceFactory kann leider nur einen Logger automatisch erstellen. Möchte man mehrere Logger für unterschiedliche Dinge verwenden (Exceptions, Errors, Nachrichten, ...) muss man dies selber erstellen. Hierfür ist eine eigene Factory hilfreich, die mehrere Logger erstellen kann. Dazu könnte man als Beispiel einen Wrapper bauen, welche die eigenen Instanzen lädt und verwaltet. Diese könnte man sich bei Verwendung dann immer heranziehen.

'service_manager' => array(
     'factories' => array(
         'logger' => 'Application\Service\LoggerServiceFactory',
    ),
),
'loggers' => array(
    'error' => array(/* [...] */),
    'exception' => array(/* [...] */),
    'system' => array(/* [...] */),
),
$wrapper = $this->getServiceLocator()->get('logger');
$wrapper->get('error')->crit('Das ist mein Error-Logger!');
$wrapper->get('exception')->emerg('Das ist mein Exception-Logger!');
$wrapper->get('system')->info('Das ist mein System-Logger!');
Share:

Einen Kommentar verfassen

Ihre E-Mail-Adresse wird nicht veröffentlicht, sie dient nur der Identifikation! Für die Profilbilder wird Gravatar verwendet und reCAPTCHA, um Spam zu vermeiden.

Kommentare 0

Es sind noch keine Kommentare für diesen Beitrag vorhanden.