Logging mit Zend_Log
Anzeige Hier werben
Mit der Zend_Log Komponente vom Zend Framework ist es einfach ein umfangreiches Logging aufzubauen. Zend_Log kann über seine Writer in unterschiedliche Orte speichern.
Wohin kann man loggen?
- Datenbank
- Streams (z.B. eine Datei)
- Firebug (ein Firefox-Addon)
Erstes Beispiel
Als erstes hier ein kleines Code-Beispiel, wie man eine kleine Nachricht loggen kann.
1 2 3 4 5 6 7 8 9 10 11 | <?php
require_once 'Zend/Log/Writer/Stream.php';
$writer = new Zend_Log_Writer_Stream('example.log');
require_once 'Zend/Log.php';
$logger = new Zend_Log($writer);
$logger->log('Dies ist eine Information', Zend_Log::INFO);
?>
|
Als erstes wird hier der Writer erstellt. Dieser legt fest, wohin die Einträge geschrieben werden. In unserem Fall nutzen wir einen Stream bzw. eine Datei, in die wir schreiben. Danach müssen wir den eigentlichen Logger erstellen und wir übergeben ihm den Writer. Das ist soweit eigentlich schon alles, was man zum Loggen braucht.
Eine Nachricht loggen kann man über die log()-Methode des $logger-Objekts. In diesem Fall ist es eine Information, die wir loggen möchten. Mit Zend_Log::INFO definieren wir, dass es sich bei dieser Nachricht um eine Information handelt. Der erste Parameter ist somit die Nachricht, der zweite der Typ bzw. die Priorität.
Die Priorität ist eigentlich weniger eine Priorität im eigentlichen, da man nicht sagen kann, dass die geringste die höchste oder niedrigste ist. Es ist eher ein Typ. Bei Zend_Log heisst es aber Prioritäten, also nennen wir den hier auch so.
Welche Prioritäten gibt es?
Zend_Log::EMERG(Notfall: das System ist nicht verwendbar)Zend_Log::ALERT(Alarm: Aktionen müßen sofort durchgefüht werden)Zend_Log::CRIT(Kritisch: Kritische Konditionen)Zend_Log::ERR(Fehler: Fehler Konditionen)Zend_Log::WARN(Warnung: Warnungs Konditionen)Zend_Log::NOTICE(Notiz: Normal aber signifikante Kondition)Zend_Log::INFO(Informativ: Informative Nachrichten)Zend_Log::DEBUG(Debug: Debug Nachrichten)
In den Klammern hinter den Konstanten sind kurze Erklärungen (kopiert aus der Framework Dokumentation), wofür diese Prioritäten genutzt werden können.
Schnell kommt man an eine Stelle, wo diese Prioritäten nicht mehr ausreichen. Die Entwickler dieser Komponente haben natürlich auch an diesen Fall gedacht und haben eine Methode addPriority() hinzugefügt.
1
2
3
4
5
6
7
8
9 | <?php
/* ... */
$logger->addPriority('meine eigene Priorität', 8);
$logger->log('Eine Nachricht mit meiner eigenen Priorität.', 8);
?>
|
Nachdem ihr eine neue Priorität hinzugefügt habt, könnt ihr diese direkt für Nachrichten mit eurer eigens definierten Priorität verwenden.
Prioritäten unterschiedlich behandeln
Dafür müssen wir das erste Code-Beispiel nochmal anpassen. Es wird nun ein weiterer Writer benötigt, damit wir die unterschiedlichen Nachrichten jeweils woanders hinloggen können.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php
require_once 'Zend/Log.php';
$logger = new Zend_Log();
require_once 'Zend/Log/Writer/Stream.php';
$fileWriter = new Zend_Log_Writer_Stream('example.log');
$fileWriter->addFilter(Zend_Log::INFO);
require_once 'Zend/Mail.php';
$mail = new Zend_Mail();
$mail->setFrom('noreply@example.org');
$mail->addTo('ich@zuhause.de');
$mailWriter = new Zend_Log_Writer_Mail($mail);
$mailWriter->addFilter(Zend_Log::EMERG);
$logger->addWriter($fileWriter);
$logger->addWriter($mailWriter);
$logger->log('eine Information', Zend_Log::INFO);
$logger->log('ein Notfall', Zend_Log::EMERG);
?>
|
Nun werden alle Informationen (Zend_Log::INFO) in eine Datei (example.log) geschrieben und Notfälle (Zend_Log::EMERG) werden als E-Mail an ich@zuhause.de verschickt.
Achtung: Es sieht nun zwar so aus, als würden alle Notfälle nur per E-Mail verschickt, aber dem ist nicht so. Die Notfälle werden ebenfalls in die Datei geschrieben. Technisch gesehen hat die Konstante Zend_Log::EMERG den Wert 0, die Konstante Zend_Log::INFO den Wert 6. Über den Filter wird definiert, ab welcher Priorität (die Höhe des numerischen Werts ist hier wichtig) in den Writer geschrieben wird, nicht, dass nur bei der angegebenen Priorität in den Writer geschrieben wird.
Logs formatieren
Über Formatierer kann man das Format des Eintrags definieren, in dem die Nachrichten in das Speichermedium geschrieben werden sollen. Aktuell gibt es zwei Formatierer.
Die Formatierer
Zend_Log_Formatter_SimpleZend_Log_Formatter_Xml
Simple
Über den ersten der beiden Formatierer kann man ganz einfach das reine Format des Eintrags definieren. Hier ein Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php
/* ... */
require_once 'Zend/Log/Formatter/Simple.php';
$formatter = new Zend_Log_Formatter_Simple("%timestamp% %priorityName% (%priority%): %message%\n");
$fileWriter->setFormatter($formatter);
$logger->log('Eine Information', Zend_Log::INFO);
?>
|
Der Eintrag, welcher nun in die Datei ($fileWriter) geschrieben wird, sähe dann so aus:
1 | 2009-05-06T20:30:00+02:00 INFO 6: Eine Information
|
XML
Das gleiche hier nochmal mit dem XML-Formatierer:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php
/* ... */
require_once 'Zend/Log/Formatter/Xml.php';
$formatter = new Zend_Log_Formatter_Xml();
$fileWriter->setFormatter($formatter);
$logger->log('Eine Information', Zend_Log::INFO);
?>
|
Nun würde folgender Eintrag in der Datei auftauchen:
1
2
3
4
5
6 | <logEntry>
<timestamp>2009-05-06T20:30:00+02:00</timestamp>
<message>Eine Information</message>
<priority>6</priority>
<priorityName>INFO</priorityName>
</logEntry>
|
Die Magie von Zend_Log
Was sind magische Methoden?
In PHP gibt es seit der Version 5.0 sogenannte magische Methoden. Welche es alle gibt, lässt sich in der Dokumentation nachlesen. Zend_Log nutzt die magische __call()-Methode. Mit dieser Methode lassen sich Methodenaufrufe abfangen für die es keine passende Methode gibt.
Wofür nutzt Zend_Log die __call()-Methode?
Zuvor erstmal ein Bespiel:
1
2
3
4
5
6
7 | <?php
/* ... */
$logger->debug("Dies ist eine DEBUG Nachricht");
?>
|
In diesem Beispiel wird die Methode debug() aufgerufen. Wenn man nun in den Code der Klasse schauen würde, würde man sehen, dass es diese Methode nicht gibt. In dem Fall greift nun die __call()-Methode und behandelt den Aufruf. Es gibt die Priorität debug und die __call()-Methode nutzt den Methodennamen nun als Priorität und leitet die Anfrage intern an die log()-Methode weiter mit dem zweiten Parameter Zend_Log::DEBUG. Dies funktioniert auch mit allen anderen Prioritäten.
Todo
- Beispiel für den Writer Zend_Log_Writer_Firebug (inkl. Logging Styles)
- Beispiel für den Writer Zend_Log_Writer_Db
Verwandte Artikel
Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher hat 1 Person an der Seite "Logging mit Zend_Log" mitgewirkt.
Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Logging mit Zend_Log" hier bearbeiten.
-
arbeitet bei der Adcloud GmbH als Software Engineer und beschäftigt sich bereits seit dem Jahr 2000 mit der Entwicklung von dynamischen Internetseiten.

