Sven Rautenberg: Errorlog erweitern

Beitrag lesen

Moin!

Bei meinem kleinen CMS können Fehler auftreten, die mit PHP nichts zutun haben, aber dennoch Fehler sind (404er Seiten Bspw.); mir ging es nur darum, diese mitzuloggen, vorher hatte ich sie sozusagen völlig "ignoriert".

404-Seiten gehören im Access-Log geloggt - indem das CMS HTTP-Status 404 zurückliefert anstelle von 200. Wenn dein CMS das bislang noch nicht kann, gehört diese Funktion schleunigst integriert. Dann können dir auch alle gewöhnlichen Logfile-Statistik-Programme die Info zusammenfassen.

»» 1. Ich muß eine DB-Connection haben, wenn ich loggen will. Habe ich nicht immer. Und die Abhängigkeit der Log-Funktion von DB-Funktionen ist auch extrem unschön, weil Datenbankzugriffe einfach nicht in den Machtbereich eines Loggers gehören.

Es geht aber auch ohne die DB-Connection, also die Fehler werden trotzdem geloggt, auch wenn sie nichts mit der DB zutun haben, zwar nicht im gewünschten Format, aber ich bekomme sie zu sehen.

Aber deine Logfunktion erfordert zwingend einen zweiten Parameter, der ein Objekt mit der Eigenschaft "error" sein muss, und greift außerdem auf mysqli_connect_error() zu.

»» 2. error_log() arbeitet mit diversen Logzielen, die in der php.ini konfiguriert werden können - nicht nur mit Dateien!

Wo kann ich sie denn noch speichern? Ich muss ja die möglichkeit haben, diese auszulesen.

Die Liste von http://de.php.net/manual/en/function.error-log.php ist ja recht ausführlich.

Allerdings hatte ich übersehen, dass du explizit Typ 3 festlegst. Andererseits: Diese explizite Festlegung hat ihre Nachteile dann, wenn dein CMS nicht von dir auf deinem Host eingesetzt werden soll, sondern woanders. Üblicherweise würde man vermutlich erwarten, dass die Fehler genau in dem Logfile auftauchen, welches von der php.ini definiert wurde.

»» Wenn du schon einen Datei-only-Logger schreibst, warum schickst du dann die Meldungen nicht per Dateifunktion ins Logfile?

Durch error_log werden auch PHP-Fehler gespeichert, ich weiss nicht, wie ich diese selbst abfangen und dann speichern kann.

Aber diese Fehler landen nur dann in DIESEM Logfile, wenn die php.ini entsprechend konfiguriert ist - oder du einen eigenständigen Error-Handler definiert hast, der dann wieder deine eigene Logfunktion benutzt.

»» 3. Die Konstante ErrorLogFile ist mir unbekannt.

Muss ja auch erst definiert werden ;) Dafür sind ja Konstanten gedacht, denke ich mal.

Dann ist die Definition eines dritten optionalen Parameters in der Funktion überflüssig. Entweder der Dateiname wird als Konstante definiert, oder der Dateinamenparameter nutzt einen "vernünftigen" statischen Defaultwert.

»» 4. Das Löschen einer zu großen Logdatei ist nicht Aufgabe des Loggers, sondern der Logfile-Rotation.

Was ist eine Logfile-Rotation?
Da hat aber auch der Alexander einen wichtigen Punkt angesprochen; wenn die Datei zu gross ist, werde ich sie zippen und speichern, dass ist wohl Sinnvoller, als sie einfach zu löschen.

Beides ist nicht die Aufgabe des Loggers. Denn der Logvorgang hat gefälligst maximal schnell abzulaufen - das Zippen einer Gigabyte-Logdatei dauert hingegen seine Zeit.

Wenn du es vernünftiger lösen willst, dann schreibst du dir einen Mechanismus, der pro Tag, Woche oder Monat einen neuen Logfilenamen verwendet, und bietest in deinem Admin-Backend eine Möglichkeit, die generierten Logfiles zu verwalten, zu zippen, auszuwerten oder zu löschen.

»» Unsinnig ist es hingegen, die Datenbank hier mit einzufügen, denn einen DB-Fehler loggt man dann, wenn man sieht, dass einer aufgetreten ist. Man loggt nicht pauschal, um eventuell auch einen DB-Fehler zu erfassen. Die Generierung und Anhübschung des DB-Fehlers gehört also nicht in den Logger selbst, sondern extern in eine Meldungsgenerierungsfunktion.

ich kann jetzt z. B. mitloggen, wenn jemand eine nicht existierende Seite aufruft

Braucht bzw. verursacht die Fehlermeldung scheiternde Datenbankzugriffe?

oder irgendeinen Schwachsinn in die URI schreibt

Wenn das Datenbankfehler erzeugt, ist auch irgendwas ganz böse falsch in deinem Datenbankcode. Es taucht aber in jedem Fall im Access-Log auf, dafür ist das ja da.

aber ich werde deine Vorschläge berücksichtigen und mir noch ein wenig den Kopf darüber zerbrechen, so ganz gefällt es mir das, was ich jetzt habe, auch noch nicht.

Wie gesagt: Wenn die Datenbank irgendwelche Fehler produziert, dann willst du das loggen, indem du die DB-Fehlermeldung in die Logdatei schreibst. Gerne auch mit Host, URL und Uhrzeit dabei. Du willst aber nicht irgendwas loggen, und nebenbei auch noch den letzten DB-Fehler - ich glaube nämlich nicht, dass jemals diese Konstellation auftritt, dass beim Aufruf der Log-Funktion auch noch unbemerkt ein DB-Fehler existiert.

- Sven Rautenberg