Ein Logger mit verschiedenen Ausgabemöglichkeiten
Wer braucht so etwas?
Viele kennen das Problem: Man will irgendwo Ausgaben machen, vielleicht auch Fehler oder Exceptions mitloggen. Das Unbequeme: Auf einem Live-System will man die Fehler nicht unbedingt wie auf dem Entwicklungs-System direkt am Bildschirm ausgeben, sondern in Dateien schreiben oder per E-Mail senden. Hier setzt jetzt mein Logger an.
Wie funktioniert's?
Im Prinzip ganz einfach: Man erstellt eine Instanz des Loggers (normal per new oder als Singleton -> Wikipedia-Eintrag) und weist dieser Instanz sogenannte Writer zu.
Dazu kann man dem Logger verschiedene "Channels" zuweisen. Darunter versteht man verschiedene Stufen, wie kritische Fehler, Warnungen, Debug-Ausgaben u. ä.. Jeder Writer erhält abhängig verschiedene Parameter; einer muss allerdings immer vorhanden sein: Die Formatierung.PHP-Code://Die Instanziierung per Singleton:
$log = ZN_Log::instance();
Diese wird später von sprintf benutzt, um die Ausgabe zu formatieren. Momentan sind drei verschiedene Writer implementiert:
Der Mail-Writer ist bisher nur rudimentär implementiert. Hier bietet es sich in Zukunft an, eine fertige Mailer-Klasse wie z. B. Zend_Mail zu benutzen. Außerdem sollte man hier einen Mechanismus umsetzen, der dafür sorgt, dass die Nachrichten erst am Ende des Skripts in einem Rutsch gesendet werden, da sonst im schlimmsten Fall jede Nachricht einzeln gesendet wird.PHP-Code://Ausgabe auf dem Bildschirm
$log->addWriter('ERROR', new ZN_Log_Writer_Screen(array('format'=>"%1\$s [%2\$s]<br />--------------------------------------------------------------------------------<br />%3\$s<br />--------------------------------------------------------------------------------<br/><br />")));
//Nachrichten in eine Datei schreiben (Hier wird als zusätzlicher Parameter eine Log-Datei benötigt)
$log->addWriter('ERROR', new ZN_Log_Writer_File(array('file'=>dirname(__FILE__).'/test.log', 'format'=>"%1\$s [%2\$s]\n--------------------------------------------------------------------------------\n%3\$s\n--------------------------------------------------------------------------------\n\n")));
//Versenden der Nachrichten per E-Mail
$log->addWriter('ERROR', new ZN_Log_Writer_Mail(
array(
'recipients'=>array(
'test@example.com'
),
'from'=>'test@example.com',
'subject'=>'Ein Fehler ist aufgetreten',
'format'=>"%1\$s [%2\$s]\n--------------------------------------------------------------------------------\n%3\$s\n--------------------------------------------------------------------------------\n\n")
)
);
Es gibt drei verschiedene Platzhalter für den format-Parameter:
%1$s bzw. %1\$s -> Der Channel (ERROR, DEBUG, Was auch immer)
%2$s bzw. %2\$s -> Zeitpunkt
%3$s bzw. %3\$s -> Der zu loggende Wert
Das Triggern einer Nachricht ist letztendlich ganz einfach:
Der erste Parameter ist der Channel (In diesem Fall "ERROR"). Hier ist das Prinzip der verschiedenen Channels gut zu erkennen. Da man jedem Channel einzeln Writer zuweisen kann, hat man z. B. die Möglichkeit, bei Warnungen nur eine Log-Datei zu benutzen, bei schwerwiegenden Fehlern (Z. B. Fehler in der Datenbank) den Fehler direkt per Mail-Writer an eine E-Mail zu senden.PHP-Code:$log->log('ERROR', 'Ein Fehler ist aufgetreten');
Der zweite Parameter ist der zu loggende Inhalt. Das kann jede Art von Datentyp sein (Arrays, Strings, Zahlen, Objekte).
Als optionalen dritten Parameter kann festgelegt werden, ob die Nachricht direkt ausgegeben/geschrieben/versandt werden soll, oder ob sie in einem Puffer zwischengespeichert werden soll. Dies kann hilfreich sein, wenn man alle Meldungen auf einmal angezeigt, versendet haben möchte.
Eine weitere Funktion des Loggers ist flushOnShutdown. Wird diese Funktion aufgerufen, registriert der Logger eine separate Flush-Funktion beim Beenden des Skripts, so dass in jedem Fall alle noch vorhandenen Nachrichten ausgegeben werden. Diese wird so aufgerufen:
Dadurch, dass der Logger komplett objektorientiert aufgebaut ist, ist es einfach, eigene Writer zu schreiben. Diese müssen lediglich von der Klasse ZN_Log_AWriter erben und um nach Bedarf erweitert werden.PHP-Code:$log->flushOnShutdown();
War's das?
Ja - das war'sIch habe den kompletten Mechanismus möglichst einfach gehalten, damit er entsprechend stabil und einfach zu benutzen ist. Ich hoffe, einige Leute können es gebrauchen. Mir hat er schon oft geholfen. Ein Skript zum Testen liegt mit dabei. PHP5 wird vorausgesetzt.
P.S.: Beim File-Writer muss natürlich darauf geachtet werden, dass PHP überhaupt die Rechte hat, in diese Datei zu schreiben.
Wenn noch etwas offen ist, einfach fragen![]()
...Meine Meinung
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)