Um mal was beizutragen, habe ich mal den Logger aus meinem Framework extrahiert und biete den hier zum Download an. Vielleicht kann es ja jemand gebrauchen. Ich habe ihn schon mal vor einiger Zeit in einem anderen Forum gepostet, aber es kann ja nicht schaden, das hier auch noch mal zu tun.
Achtung: Für etliche der Profis hier wird der eine oder andere Aspekt nicht optimal zu sein. Das ist allerdings der Tatsache geschuldet, dass das Skript ohne viel Aufwand und mit möglichst wenigen Anforderungen einsetzbar sein soll.
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.
PHP-Code:
//Die Instanziierung per Singleton:
$log = ZN_Log::instance();
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.
Diese wird später von sprintf benutzt, um die Ausgabe zu formatieren. Momentan sind drei verschiedene Writer implementiert:
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")
)
);
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.
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:
PHP-Code:
$log->log('ERROR', 'Ein Fehler ist aufgetreten');
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.
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:
PHP-Code:
$log->flushOnShutdown();
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.
War's das?
Ja - das war's Ich 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