Ich stieß kürzlich auf diesen Artikel:
Log Everything All the Time
und fand diesen sehr interessant.
Es geht um’s mitloggen von Informationen und der damit verbundenen verbesserung der Debugfähigkeit von Software für dessen Entwickler. Das ganze klingt für mich sehr interessant, vor allem der Punkt, dass man (theorethisch) jeden Zeitpunkt zu jeder Zeit nachstellen kann – klingt sehr nach ZendServer 😉 – wäre für mich zumindest manchmal sehr wünschenswert.
Allerdings kann ich mich gut vorstellen, da so ein logging sehr an der Performance kratzt, aber der Autor gibt weiter unten im Artikel sehr nützliche Tipps, wie man das maximum herausholen kann, wenn man nur schon beim Design ein paar – wie ich finde fundemantal wichtige – Regeln beachtet, z.B. „Formatiere nichts, bis es nicht gebraucht wird“ oder „Nur ein Tabellenlookup pro Log“.
Von mir aus kommt da noch eins hinzu: „Benutze keine Frameworks!“. Au weia, jetzt hauen mich alle Zend-Freaks. Ich will damit sagen, dass beim Thema ‚logging‘ auch die Zeit eine sehr kritische Rolle spielt – wir reden hier ja nicht über ein oder zweimal loggen pro Aufruf, sondern jeden Request, in jeder Funktion, in jeder Klasse, quasi in jeder Zeile – und da zählt jede Nanosekunde. Frameworks haben diesbezüglich aber einen Nachteil: Sie haben Overhead.
Wie auch immer, ich würde gern eine Klasse für dieses Logging entwickeln und würde mich freuen, von euch Anregungen zu bekommen, was diese Klasse machen soll, wie Sie aufgerufen werden sollte (instanz, static, …) und wie und wo die Daten gespeichert werden sollten (spontan kommt mir da mysql in den Sinn, wegen durchsuchen usw.). Ich denke, wenn wir alle Ideen sammeln, können wir eine gute Logging Klasse entwickeln, die alle diese Informationen in einem guten Zeitrahmen erfasst und speichert. Das auslesen kann ja von mir aus wieder längern dauern, da kommt es nicht so auf die Zeit an.
*hm* Eventuell gibt es ja schon so eine Klasse, irgendwo, allein oder versteckt in einem Framerwork. In dem Fall bitte ich um einen kurzen Hinweis, dann kann ich mir die Arbeit sparen und direkt produktiv loggen.
Was denkt ihr über den Artikel? Was haltet ihr von so einer Klasse?
P.S.: Sorry, die Klasse soll primär für PHP sein, die Ideen natürlich für alle!
Schau dir doch mal log4php an 😀
@Norbert: Danke für den Hinweis, aber log4php bietet zuwenig Informationen dafür.
Sicherlich soll „unsere“ Klasse nachher ebenso leicht zu bedienen sein ($log->log(‚…‘)), allerdings sollen dabei auf jeden Fall mehr Informationen gespeichert werden ($_GET, $_POST, aktuelle Zeit, …). Das, was log4php bietet, könnte als Vorlage für die Bedienung dienen.
Mir kam beim lesen des Posts die Idee, die Lognachrichten mit Tags zu versehen bzw. zu kategorisieren (natürlich optional).
Damit könnte man einzelne Aspekte einer Anwendung loggen… Aspektorientiertes Logging. x)
Ansonsten würde ich es dem Benutzer überlassen was er loggen will, also eine große Funktionsauswahl bieten [log($string), logException($e), logParams()…] oder als Parameter alles mögliche akzeptieren und entsprechend behandeln.
Ganz wichtig ist vor allem, dass man den Logger „ausschalten“ kann, dass er gar nichts mehr macht.
Übrigens: ich würde nicht in eine Datenbank loggen, das schafft eine weitere Abhängigkeit. Auf die Platte loggen reicht aus. Unter Linux hat man mit grep, tail und less gute Werkzeuge mit den Logs zu arbeiten.
Damit weniger Plattenzugriffe gemacht werden, könnte man alle Logs sammeln und im Destructor rausschreiben. Über nen längeren Zeitraum puffern wär auch ne Möglichkeit, weiß aber nicht, wie das mit PHP geht.