PHP Logging Frameworks
Davon gibt es bekanntlich viele. Aber wie schnell und Komfortabel sind diese? Meine Persönliche Einschätzung sieht so aus:
1) Simples fopen und selber loggen.
Das ist sicherlich die schnellste Variante, jedoch hat man hier keinerlei Standardisierung wenn man z.B. mit mehreren Leuten an einem Projekt arbeitet. Dazu kommt noch dass man für Email, HTML und andere Ausgabeformate selbst Hand anlegen muss. Dabei wollen uns jedoch die folgenden Frameworks helfen.
2) KLogger
Ist quasi fopen nur ein wenig abstrahiert und mit severity ergänzt, ist somit auch vom Output bereits standardisiert. Andere Ausgabe-Formate wie Email und Co. gibt es nicht.
3) Log PEAR
Sehr umfangreiches Framework mit reichhaltigen Ausgabemöglichkeiten (Mail, DB, /dev/null ). Das einzige was fehlt ist die MaxFileSize und die RollingFile Implementierung. Dennoch sehr übersichtliches und schnelles Framework. Mein Favorit, werde intensiv testen.
4) Log4php
Der Mercedes unter den Logging Framworks, hat sogar die Implementierung für MaxFileSize und die RollingFile. Was mir absolut nicht gefällt ist das die Konfiguration außerhalb des Scriptes stattfinden muss. Man kann die Konfiguration in allen erdenklichen Art und Weisen hinterlegen (XML, INI, PHP ...) aber es muss eine separates File sein das man dem Logger zum initialisieren gibt. Zum Kotzen!!! Mehrere Logger mit separaten ConfigFiles in einem Script sorgen für einen Konflikt und es logt nur der erste Logger mit. Legt man die ConfigFiles zusammen so werden alle logfiles beim Start geleert auch wenn man den Logger nicht benutzt... beim init quasi. Das sorgt für CHAOS! Ich glaube hier muss noch nach-gebessert werden und ich will die Config im PHP haben!!! Oder ich habe das Ding einfach nur noch nicht ganz gerafft... in jedem Fall ein dickes Minus entweder weil es dass nicht kann oder weil es zu kompliziert ist und es dazu keine Beispiele gibt!:twisted:
Update: Nach dem mich Christian vom Log4PHP Team aufgeklärt hat ist es sehr wohl möglich die Konfiguration mit dem einem Array in vollem Umfang zu machen und das sogar recht einfach. Siehe http://logging.apache.org/log4php/docs/appenders/file.html und dann auf PHP klicken wie Christian es in den Kommentaren beschrieben hat. ... Ich bin doch tatsächlich an der "nüchtern betrachtet" recht übersichtlichen und guten Doku gescheitert... *lol*! Danke für den Hinweis Christian, meine "hausgemachten" Probleme wären somit Geschichte!
5) Analog
Übersichtliches umfangreiches Framework, ähnlich dem Log PEAR nur langsamer
.
6) NmnLogger
Der OPFER - Logger schlecht hin. Funktioniert nicht auf Anhieb... Examples funktionieren nicht (direkter Aufruf ohne Apache - absolute Pfade Erforderlich - geht nicht). Nach einem QuckFix scheitert es an der mitgelieferten XML Konfig-Datei. Absolut unübersichtlich. Zwar scheint das Framework auch Email, SQL und noch ein Paar Ausgaben zu unterstützen... aber so lange es die Benutzerfreundlichkeit eines bereits gebrauchten Kondoms hat, werde ich das Zeug nicht anfassen und keine Sekunde daran verschwenden.
Benchmark
Die Bedingungen sind recht einfach, der logger soll 1000 Einträge in die Datei schreiben, dabei wird die Zeit gemessen und das war es auch schon. Der Benchmark wird von der CommandLine aufgerufen um möglichst direkt am PHP Kern zu sitzen.
Konfiguration
CPU: i5 2500K
RAM: 8GB DDR3
HDD: OCZ Vertex 3 SSD AHCI
OS: Win 7 Pro X64
PHP: 5.3.8.
Source: Download
Ergebnis
| Simple_fopen: | 0.022995948791504 Sek. |
| KLogger: | 0.036224842071533 Sek. |
| Log_PEAR: | 0.053684949874878 Sek. |
| Log4Php: | 0.12046194076538 Sek. |
| Analog: | 0.16966009140015 Sek. |
| NmnLogger: | NOT WORKING! Sek. |
Fazit:
Wer für alle Fälle gerüstet sein will und vermeiden möchte dass Log-Files mit der Zeit nicht überlaufen (MaxFileSize / RollingFile) der greift zu Log4PHP. Mit seinen Zahlreichen Appendern sollte für jeden was dabei sein. Wer es allerdings etwas schneller haben muss und auf ein wenig Komfort sowie MaxFileSize & RollingFile verzichten kann, der sollte sich Log (PEAR) anschauen.
In diesem Sinne: Happy Logging - und nicht vergessen "TLDR" - logt nur das was absolut notwendig ist!!!

Februar 10th, 2012
Hallo!
Du musst nicht zwingend ein File anlegen. Zum Beispiel mit der PHP Konfiguration kannst du das direkt angeben, wie hier:
Logger::configure(array( 'rootLogger' => array( 'appenders' => array('default'), ), 'appenders' => array( 'default' => array( 'class' => 'LoggerAppenderConsole', 'layout' => array( 'class' => 'LoggerLayoutSimple' ) ) ) ));Hier ist der Link:
http://logging.apache.org/log4php/docs/configuration.html
Steht in der “PHP”-Sektion
Wir log4php Jungs helfen dir übrigens auch gerne auf der Mailingliste weiter, falls mal was nicht klappt. Und wir sind auch immer über Verbesserungsvorschläge dankbar!
Cheers
Christian
Februar 11th, 2012
Danke für deinen Hinweis, den hatte ich bereits berücksichtigt. Es ist möglich auf diese Art einen einfachen Logger ‘LoggerAppenderConsole‘ so einzubinden. Aber sobald es etwas spezieller wird, z.B. ‘LoggerAppenderFile‘ so finde ich nirgends Beispiele. Ich habe natürlich versucht das ganze mit Logischen Schlussfolgerungen ans Laufen zu bringen und meiner Ansicht nach sollte es so funktionieren:
Logger::configure(array( 'rootLogger' => array( 'appenders' => array('default'), ), 'appenders' => array( 'default' => array( 'class' => 'LoggerAppenderFile', 'layout' => array( 'class' => 'LoggerLayoutTTCC' ), 'file' => dirname(__FILE__) . '/log/log4php_file.log', 'append' => true ) ) ));Aber das tut es nicht. Log4Php meldet sich mit dem Fehler:
Eine Einstellung für “file” oder “fileName” konnte ich trotz Debugging nicht finden (Also die Property habe ich schon gefunden, aber diese wird nirgends von dem Array configurator gesetzt. Wenn es jemand weiß, lasse ich mich hier gerne des besseren belehren. Das führt uns wieder zum Ursprungsproblem.
Ich habe auf der von dir geposteten Seite einen anderen Ansatz unter dem Punkt “Programmatic configuration” gefunden, diese Lösung finde ich nicht so schön wie mit dem Array auch wenn sie aus Programmatischer Sicht nicht schlechter ist.
Februar 12th, 2012
Hallo nochmal
schau doch mal auf diese Seite un dklicke auf den Reiter “PHP”:
http://logging.apache.org/log4php/docs/appenders/file.html
array( 'appenders' => array( 'default' => array( 'class' => 'LoggerAppenderFile', 'layout' => array( 'class' => 'LoggerLayoutTTCC', ), 'params' => array( 'file' => 'file.log', 'append' => false ), ), ), 'rootLogger' => array( 'appenders' => array('default'), ), );Du musst in dem Array noch ein “params” mit angeben.
Februar 13th, 2012
Touché! Ok das hat mir in meinem Puzzle gefehlt. Ich meine auch gründlich geschaut zu haben… aber wie ich den Wald vor lauter Bäumen übersehen konnte ich mir ein Rätsel! Danke für die Aufklärung
! Meine Probleme wären somit erledigt, habe den Beitrag nochmal aktualisiert.
Februar 13th, 2012
Cool, danke fürs aktualisieren
Cheers!°
Februar 15th, 2012
Gnaaaa… ich war doch nicht zu doof…
Ich hatte das nur vor ein “paar” Monaten mit der Version 2.0 ausprobiert… und diese auch seither nicht mehr aktualisiert. So kann man sich auch selbst trollen… aber wenn ich es nicht verpeillt hätte… gäbe es diesen Beitrag nicht, insofern nochmal alles gut gegangen
.