PHP: Protokollstack-Trace für FATAL-Fehler in der Produktion

8

Ich möchte alle fatalen Fehler, auch Timeout und andere E_ERRORS, protokollieren. Ich benutze set_error_handler und shutdown-Funktion, aber mit dem letzten kann ich nicht den StackTrace haben. Gibt es einen Weg, es zu haben?

Ich möchte Fehlalarme auf einem Produktionsserver protokollieren, um Fehler zu beheben, die nur in der Produktion auftreten. Ich weiß, xdebug auf Dev-Servern muss genug sein, aber es ist nicht. Vielleicht können wir xdebug mit dem Minimum der aktivierten Optionen verwenden, oder eine abgespeckte Version davon, um die Stack-Ablaufverfolgung dem Fehlerprotokoll hinzuzufügen?

Dieser Code gibt Fehlerinformationen aus, wenn ein Fehler auftritt, sogar ein Timeout.

%Vor%     
Cédric Girard 24.01.2012, 17:01
quelle

4 Antworten

7

Sie erhalten keinen Stack-Trace für den schwerwiegenden Fehler, da "FATAL" bedeutet, dass die Skriptausführung sofort stoppt , d. h. der Trace kann nicht über die üblichen Kanäle generiert werden. Wenn Sie also einen benutzerdefinierten Error-Handler zum Auslösen von Ausnahmen festgelegt haben, wird er nicht wie in PHP Handbuch :

  

Die folgenden Fehlertypen können nicht mit einem Benutzer definiert werden   Funktion: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING,   E_COMPILE_ERROR, E_COMPILE_WARNING und die meisten E_STRICT in der   Datei, in der set_error_handler () aufgerufen wird.

Der einfachste Weg, um Informationen darüber zu erhalten, was im fatalen Fehler passiert ist (kurz, um display_errors einzuschalten, was in Produktionsumgebungen keine Option ist), ist, die Fehlerinformationen manuell im Shutdown-Handler zu erstellen. Außerdem würde ich xdebug nicht auf einem Produktionsserver verwenden ... es dient zum Debuggen Ihrer Entwicklungsumgebung und fügt unnötigen Overhead in einer Produktionsumgebung hinzu.

Wenn Sie also Ihren Shutdown-Handler ändern, können Sie Folgendes tun:

%Vor%     
rdlowrey 24.01.2012 17:15
quelle
3

Wenn Sie HHVM verwenden, können Sie

festlegen %Vor%

in Ihrem php.ini , damit der Fehlerhandler (mit einem Stack-Trace) bei schwerwiegenden Fehlern aufgerufen wird. ( weitere Informationen )

Die Verwendung eines Profilers könnte auch eine Option sein - z. Verwenden Sie XHProf und rufen Sie xhprof_disable() im fatalen Handler auf, damit Sie etwas erhalten, das entfernt einem Stack-Trace ähnelt. (Keine Ahnung, ob das tatsächlich funktioniert.)

    
Tgr 05.09.2015 00:03
quelle
1

Zum Abfangen von maximalen Ausführungstimeouts können Sie php-fpm verwenden und slowlog + request_slowlog_timeout einstellen, das den vollen Stack protokolliert Spuren.

    
suside 02.08.2012 07:55
quelle
0

Dies funktioniert bei mir (innerhalb einer Bedingung, sodass es nur in einer Entwicklungsumgebung ausgeführt wird):

%Vor%     
Walf 07.06.2017 00:09
quelle

Tags und Links