2008-08-21 12 views
11

Ich habe herausgefunden, wie man Fehler in Ausnahmen konvertiert, und ich zeige sie schön, wenn sie nicht abgefangen werden, aber ich weiß nicht, wie man sie auf eine nützliche Weise protokolliert. Sie einfach in eine Datei zu schreiben ist nicht sinnvoll, oder? Und würden Sie riskieren, auf eine Datenbank zuzugreifen, wenn Sie nicht wissen, was die Ausnahme schon verursacht hat?Wie protokolliere ich nicht erfasste Ausnahmen in PHP?

Antwort

5

Ich mag log4php für die Protokollierung, obwohl es noch nicht aus dem Inkubator ist. Ich benutze log4net in fast allem und habe den Stil für mich ganz natürlich gefunden.

In Bezug auf Systemabstürze können Sie den Fehler an mehreren Zielen protokollieren (z. B. Appender haben, deren Schwelle CRITICAL oder ERROR ist, die nur ins Spiel kommen, wenn etwas schief läuft). Ich bin mir nicht sicher, wie ausfallsicher die vorhandenen Appender sind - wenn die Datenbank ausfällt, wie funktioniert dieser Appender? - aber Sie könnten ganz leicht einen eigenen Appender schreiben, der fehlerfrei funktioniert, wenn er nicht protokolliert werden kann.

+0

log4php hat eine großartige Funktionalität, aber für mich hat es sehr langsam funktioniert! – JohnM2

+0

Es ist jetzt aus dem Inkubator und die URL hat sich geändert zu http://logging.apache.org/log4php/ – Mike

11

Sie könnten set_error_handler verwenden, um eine benutzerdefinierte Ausnahme zum Protokollieren Ihrer Fehler festzulegen. Ich würde es persönlich in Erwägung ziehen, sie in der Datenbank zu speichern, da der Standard-Exception-Handler die Backtrace-Informationen darüber liefern kann, was sie verursacht hat - dies ist natürlich nicht möglich, wenn der Datenbank-Handler die Ausnahme ausgelöst hat.

Sie könnten auch error_log verwenden, um Ihre Fehler zu protokollieren. Es verfügt über eine Auswahl an Nachrichtenziele einschließlich:

Zitat von error_log

  1. PHP-System-Logger, das Betriebssystem des System-Logging-Mechanismus oder einer Datei, je nachdem, was die error_log Konfigurationsdirektive eingestellt ist. Dies ist die Standardoption.
  2. Per E-Mail an die Adresse im Zielparameter gesendet. Dies ist der einzige Nachrichtentyp, bei dem der vierte Parameter extra_headers verwendet wird.
  3. An das Dateiziel angehängt. Ein Zeilenende wird nicht automatisch am Ende der Nachrichtenzeichenfolge hinzugefügt.

Edit: Hat Abschlag einen noparse Tag für Unterstrichen?

3

Sie einfach in eine Datei zu schreiben wird nicht nützlich sein, oder?

Aber natürlich ist es - das ist eine große Sache, viel besser zu tun, als sie auf dem Bildschirm angezeigt wird. Sie möchten dem Benutzer einen schönen Bildschirm zeigen, auf dem steht: "Entschuldigung, wir haben getäuscht. Die Techniker wurden benachrichtigt. Gehen Sie zurück und versuchen Sie es erneut" und ABSOLUT KEINE TECHNISCHE DETAILS, da dies ein Sicherheitsrisiko darstellt. Sie können eine E-Mail an ein freigegebenes Postfach senden und die Ausnahmebedingung für eine spätere Überprüfung in der Datei oder in der Datenbank protokollieren. Dies wäre eine Best-Practice-Methode.

0

Ich denke, es hängt viel davon ab, wo Ihr Fehler aufgetreten ist. Wenn die DB ist es in der DB Protokollierung ist keine gute Idee;)

Ich benutze die syslog() Funktion für die Protokollierung des Fehlers, aber ich habe keine Probleme, es in eine Datei schreiben, wenn ich auf einem System bin, das keine hat Syslog-Unterstützung. Sie können Ihr System einfach so einrichten, dass es Ihnen eine E-Mail oder eine Jabber-Nachricht sendet, zum Beispiel mit logwatch oder the standard syslogd.

1

Ich würde sie in eine Datei schreiben - und vielleicht ein Überwachungssystem einrichten, um nach Änderungen der Dateigröße oder des Datums der letzten Änderung zu suchen. Webmin ist ein einfacher Weg, aber es gibt umfassendere Softwarelösungen.

Wenn Sie wissen, dass es sich um einen einmaligen Fehler handelt, kann eine Benachrichtigung per E-Mail versandt werden. Allerdings, mit einer Vielzahl von Treffern pro Minute Website, nicht jemals per E-Mail eine Benachrichtigung. Ich habe gesehen, wie eine Website zum Absturz gebracht wurde, indem Hunderte von E-Mails pro Minute generiert wurden, um zu sagen, dass das System keine Verbindung zur Datenbank herstellen konnte. Die Tatsache, dass es auch einen LoadAvg von> 200 hatte, weil der Mailserver für jede neue Nachricht ausgeführt wurde, half überhaupt nicht. In diesem Fall war das beste Szenario bei weitem der Watchdog, der nach Dateigrößen sucht und sich mit einem externen Dienst verbindet, um eine SMS zu senden (vielleicht eine Sofortnachricht), oder ein externes System auf einer Webseite nach einer Fehlermeldung fragt muss nicht auf dem Bildschirm sichtbar sein - es kann in einem HTML-Kommentar sein).

0

Ich zweite log4php. Ich habe es in der Regel konfiguriert, um Dinge wie Ausnahmen zu ERROR oder CRITITCAL zu senden und sie in Syslog geschrieben haben. Von dort können Sie Ihren Syslog-Feed in Zenoss, Nagios, Splunk oder etwas anderes, mit dem Syslog sprechen kann, haben.

0

Sie können PHP-Ausnahmen auch mit Google Forms erfassen und aufzeichnen. Es gibt ein Tutorial here, das den Prozess erklärt.

+5

+1 für das Hinzufügen zu Google bereits bestehenden Monopol über Ihre wichtigen Daten. –

Verwandte Themen