Ein wichtiges Thema bei der Entwicklung – und darüber hinaus – ist das Logging. Üblicherweise gibt es verschiedene Log-Level, die angeben wie schwer ein Fehler ist bzw ob es sich nur um eine Information oder nur eine Debug-Meldung handelt. Der Vorteil eines Logging-Frameworks ist die Einfachheit in der Konfiguration, denn ein Entwicklungssystem, ein Stangingsystem und das Livesystem nutzen verschiedene Einstellungen. Log4php ist ein solches Framework, das vom Aufbau her wie log4j ist und im Apache Incubator Programm zu finden ist.
log4php bietet von hause aus die Level Debug, Info, Warn, Error und Fatal. Wobei die schwere der Meldung von Links nach Rechts zunimmt. Für einen Logger besteht nun die Möglichkeit einen minimalen LogLevel anzugeben. D.h. es Warn als Minimum angenommen und somit nur Warn, Error und Fatal geloggt. Natürlich kann man auch einzelne Level einem Logger zuordnen.
Die Logdaten können zu verschiedenen Zielen gesendet werden. Das einfachste ist eine Meldung auf der Console rauszuschreiben. Bei einer Webapplikationen ist es aber sinnvoll die Daten in einem persistenten Zustand zu halten. Hierfür eignet sich am einfachsten eine Datei. Möchte man eine bessere Übersicht erhalten, kann man auch Dateien täglich erzeugen lassen. Dann kann man die täglichen Logs sehr einfach analysieren. Bei vielen Zugriffen ist es auch sinnvoll die Logs in eine Datenbank zuschreiben, da man so das Filelocking umgehen kann. Nett ist weiter die Variante die Daten an einen Remoteserver zu senden. So kann man zum Beispiel bei einem Apache Cluster die Logdateien in einem konsistenten Block halten. Die verschiedenen Ausgabe Module nennen sich Appender. Ganz besonders interessant finde ich den MailEvent-Appender. Im Falle eines fatalen Fehlers kann man so direkt einen Verantwortlichen informieren. Bei Empfangssystemen wie Blackberry, iPhone und Co kann die Bereitschaft rund um die Uhr und überall informieren.
Da auch die Ausgabe in verschiedenen Varianten möglich ist, gibt es die Layouts. Diese definieren wie die Ausgabe aussehen soll. Handelt es sich um eine xml-Ausgabe oder plain Text. Wie sieht der Zeitstempel aus und welche Informationen werden zusätzlich geloggt. Bspw. PID, Logger etc. Diese Layouts sind auch deshalb wichtig, weil man so die Log-Ausgabe an bestimmte Loganalyzer (wie bspw Chainsaw) anpassen kann.
Insgesamt ist das Framework wirklich sehr konfigurierbar. Man kann natürlich auch eigene Appender, Layouts etc in PHP programmieren um bspw Firmenrichtlinien festzulegen und die Konfigurationsdatei übersichtlich zu halten. Apropos Konfiguration:
Die Konfiguration ist etwas ungewöhnlich. Es handelt es sich um Property-Dateien. Diese kommen aus der Java Welt. Da in dem Sourcenpaket einige Beispiele vorhanden sind, kommt man damit aber sehr schnell klar und außerdem kann man in der Java-Welt Informationen zu den Property-Dateien bekommen.
Und das beste am Programmieren ist der Quelltext, darum hier ein „Hello World“ für das Logging Framework:
debug("Hello World");
?>
Log4php bietet noch weitere Komponenten wie bspw. die Renderer. Ein Renderer wird dazu genutzt eine logfähige Ausgabe für ein Objekt zu erzeugen. Genaue Informationen findet man in der log4php-Dokumentation.
Tipp: Um die Performance zu erhöhen lohnt es sich Debugmeldungen folgendermaßen zu Kapseln
if($logger->isDebugEnabled() {
$logger->debug("Entry number: ".$i." is ".entry[i]);
}
Dadurch wird der String, der als Debugmeldung erzeugt werden muss, nur dann erzeugt, wenn die Meldung auch wirklich ausgegeben wird.