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
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.
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
- 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.
- Per E-Mail an die Adresse im Zielparameter gesendet. Dies ist der einzige Nachrichtentyp, bei dem der vierte Parameter extra_headers verwendet wird.
- 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?
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.
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.
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).
Sie können PHP-Ausnahmen auch mit Google Forms erfassen und aufzeichnen. Es gibt ein Tutorial here, das den Prozess erklärt.
+1 für das Hinzufügen zu Google bereits bestehenden Monopol über Ihre wichtigen Daten. –
- 1. Wie protokolliere ich eindeutige Autoren in git?
- 2. Wie protokolliere ich SQL-Anweisungen in DropWizard
- 3. Wie behandelt man nicht erfasste Ausnahmen in Javascript ohne einen try/catch-block?
- 4. Wie können wir nicht erfasste Ausnahmen in CLI/Worker Spring Boot-Anwendungen behandeln?
- 5. Wie werden benutzerdefinierte Fehlerseiten für nicht erfasste Ausnahmen in WebSphere Portal-Portlets konfiguriert?
- 6. Sprudeln Ausnahmen in PHP?
- 7. Android-App stürzt nicht ab, reagiert jedoch nicht auf nicht erfasste Ausnahmen
- 8. Ausnahmen Vererbung in PHP
- 9. Wie protokolliere ich meine Selenium-Aktionen in example.metadata [: extra_failure_lines]?
- 10. Wie protokolliere ich Antworten auf Nachrichten in WebSphere MQ?
- 11. Wie protokolliere ich eine Ausnahme in einer Datei?
- 12. Ausnahmen in PHP, bitte erklären
- 13. Wie protokolliere ich die Anzahl der Instanzen eines Typs?
- 14. Wie protokolliere ich Zellen, die mit NSIndexPath ausgewählt wurden?
- 15. Wie behandeln Sie "unmögliche" Ausnahmen in Java?
- 16. Wie protokolliere ich Daten konsistent von meinen seriellen Ports?
- 17. Wie protokolliere ich einen langen langen Wert mit NSLog?
- 18. Wie sehe ich Ausnahmen in Swift Spielplatz?
- 19. Unterscheidung zwischen verschiedenen PHP-Ausnahmen
- 20. Wie kann ich Ausnahmen in Delphi auslösen?
- 21. Wie melde ich nicht behandelte Ausnahmen in ASP.NET MVC?
- 22. Wie protokolliere ich einen get-Request-Parameter nicht in den nginx-Zugriffsprotokollen?
- 23. Wie ignoriere ich Ausnahmen in F #
- 24. Sind alle nicht abgefangenen Ausnahmen in PHP fatal?
- 25. Wie behandle ich Ausnahmen in Konstruktoren richtig?
- 26. Wie protokolliere ich die gesamte Rückverfolgung einer Ruby-Ausnahme mit dem Standard-Rails-Logger?
- 27. AngularJS - nicht erfasste Fehler: [$ Injektor: nomod]
- 28. nicht erfasste Fehler: kein Array ASP.NET
- 29. PHP7 - nicht erfasste Fehler: Zugriff auf nicht deklarierte statische Eigenschaft
- 30. nicht erfasste Fehler: Syntaxfehler, nicht erkannte Äußerung: ajaxsample/update_agenda (CodeIgniter)
log4php hat eine großartige Funktionalität, aber für mich hat es sehr langsam funktioniert! – JohnM2
Es ist jetzt aus dem Inkubator und die URL hat sich geändert zu http://logging.apache.org/log4php/ – Mike