Heim > Artikel > Backend-Entwicklung > Protokollierungssystem im PHP-Framework
Einführung
Freunde, die mit dem PHP-Framework vertraut waren, kennen möglicherweise die wichtige Rolle von Protokollen im Projekt ., es kann uns helfen, den Fehlerort zu finden und das Programm benutzerfreundlicher zu machen (wenn es richtig gehandhabt wird, wird es nicht direkt viel Englisch wegwerfen, das nur Programmierer wirklich verwenden können, und es wird auch beim Debuggen sehr praktisch sein). kann auch einige wichtige Informationen zum Betrieb usw. aufzeichnen. Kurz gesagt, wenn ein vollständiges Projekt kein Protokollierungssystem hat, wird die Entwicklungsstraße voller Dornen und Schlaglöcher sein und definitiv stolpern.
Einführung
Um das PHP-Protokollierungssystem zu beherrschen, müssen Sie zunächst ein gründliches Verständnis dieser Dinge haben.
1. Mehrere Funktionen von PHP
set_Exception_handler(callback $Exception_handler); //Exception Capture Custom Handler Function Registration
set_error_handler(callback $error_handler ); //Fehlererfassung der benutzerdefinierten Handlerfunktion
register_shutdown_function(callback $callback); //Fehlererfassung der Handlerfunktion, wenn das Programm während der Ausführung abnormal beendet wird
Diese drei Funktionen werden bei Fehlern verwendet Die Verarbeitungssteuerung bietet Entwicklern viel Spielraum für Autonomie und sie sind für die Aufzeichnung von Protokollinformationen im Protokollsystem verantwortlich.
Wenn im Programm eine Ausnahme auftritt, löst der PHP-Kernel einen Ausnahmefehler aus und gibt dann die Fehlermeldung an den Benutzer aus. Wenn die Ausnahmebehandlungsfunktion registriert ist, wird die von PHP ausgelöste Ausnahme an sich selbst weitergeleitet Die definierte registrierte Ausnahmeabfangfunktion enthält die von uns durchzuführende Verarbeitung und zeichnet die Fehlerinformationen auf (einschließlich Fehlerdetails und Fehlerort). Nachdem die Funktion die Ausnahme behandelt hat, wird die Ausnahme beendet.
Wenn im Programm ein Fehler auftritt, konvertiert die von uns registrierte Fehlerbehandlungsfunktion die Fehlerinformationen in ein Fehlerausnahmeobjekt in der Funktion und übergibt sie an die Ausnahmebehandlungsfunktion, bei der es sich um die Funktion $Exception_handler in handelt erster Schritt.
Wenn während der Wiederaufnahme ein Fehler beim Herunterfahren auftritt, wird die von uns registrierte Funktion zur Verarbeitung abnormaler Beendigung ausgeführt. Diese Funktion ruft das Fehlerobjekt des letzten Herunterfahrens über error_get_last() ab und generiert dann einen Fehler wie im vorherigen Teil . Ausnahmeobjekt, übergeben Sie dieses Objekt an unsere registrierte Ausnahmebehandlungsfunktion.
Wie Sie sehen können, wandelt es unabhängig davon, ob es sich um eine Ausnahme oder einen Fehler handelt, seine eigenen Informationen in die von der Ausnahmebehandlungsfunktion erkannten Ausnahmeinformationen um und übergibt sie dann zur Verarbeitung an die Ausnahmebehandlungsfunktion . Die Nicht-Ausnahme-Informationen sind wie Make-up. Der Ausnahme-Handler erkennt diese Nicht-Ausnahme-Informationen nur durch Entfernen der Nicht-Ausnahme-Informationen. es sollte ausgelöst werden), wird der Ausnahmebehandler es erkennen.
Fehlerbehandlungsprozess im PHP-Protokollsystem
Dann kommt jetzt das Problem. Diese Funktionen werden normalerweise mit einer Ausnahmebehandlungsbibliothek und einer Fehlerprotokollierung kombiniert Die Klassenbibliothek für die Ausnahmebehandlung enthält drei zu registrierende Funktionen. Die oben erwähnte Funktion wird in $Exception_Handler aufgerufen am Eingang des Programm-Frameworks wie folgt:
Hier wird die Array-Methode (Klasse, Funktion) verwendet.
set_exception_handler(array("Myexception","exceptionHandler")); set_error_handler(array("Myexception","errorHandler")); register_shutdown_function(array("Myexception","shutdownHandler"));
2. Protokollierung verwandter Klassenbibliotheken
Die im ersten Teil vorgestellten Dinge erfassen nur Ausnahmen, Fehler und Abschaltungen. Dies ist nur der erste Schritt. Wir müssen die erfassten Informationen angemessen verarbeiten, z. B. die Protokollinformationen im lokalen Dateisystem aufzeichnen (dieser Vorgang befindet sich im Array („MyException“, „ExceptionHandler“)), wo die Protokollierungsklassenbibliothek verwendet wird. (Die unten erwähnte Klassenbibliothek basiert auf dem Design des Kohana-Protokollsystems.)
Die Protokollierung im japanischen Stil ist ebenfalls sehr einfach. Sie müssen die Informationen nur am Ende der Datei hinzufügen. Dies ist meiner Meinung nach einfach, aber notwendig Um ein praktisches, effizientes und erweitertes Protokoll zu entwerfen, ist es nicht so einfach, es nach einer langen Zeit der Übung zusammenzufassen und zu optimieren. Die Protokollierungsklassenbibliothek im Kohana-Framework ist relativ ausgereift es hier als Referenz.
Ich glaube, dass Benutzer, die Kohana verwendet haben, mit der Protokollierung im Kohana-Framework vertraut sein müssen. Wenn Sie damit nicht vertraut sind, werde ich weiter unten in der Anwendung kurz darauf eingehen. Bootstrap.php-Datei im Kohana-Quellcode Sie können den folgenden Code in den Zeilen 109-112 sehen:
/** * Attach the file write to logging. Multiple writers are supported. */ Kohana::$log->attach(new Log_File(APPPATH.'logs'));
Dies dient zum Hinzufügen eines Protokollierungsobjekts zum Protokollobjekt. Achten Sie auf die beiden mit olivfarbenem Hintergrund. Es handelt sich um verschiedene Klassenbibliotheksinstanzen. Der erste Teil ist das Protokollobjekt, das zur Verwaltung einer Liste von Protokollierungsobjekten verwendet wird. welches ein oder mehrere Protokollierungsobjekte enthält (dies ist der zweite Teil, diese Protokollierungsobjekte werden tatsächlich zum Aufzeichnen von Protokollen verwendet), und es gibt ein Array von Fehlerstufen, die für jedes Objekt aufgezeichnet werden müssen. Es wird nur aufgezeichnet, wenn die Fehlerstufe erreicht ist erfüllt ist, und es wird weggelassen, wenn dies nicht der Fall ist. Das Folgende ist meine eigene vereinfachte Protokollierungsmethode nach dem Umbenennen:
self::$log = Log::instance(); self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG); self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);
我这里面为了更好地理解,将“容器”命名为Log,记录的实例命名为Logwriter,可以看到我在程序入口处很容易的添加了两不同的日志种类,第一个是记录所有错误号比Log::DEBUG小的错误(错误级别比他高),并按规则记录在文件夹./data/debug下面;
第二个是记录级别等于或高于Log::NOTICE的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:
log与logwriter的关系
通过上面的图你就会看到Log是一个容器,包含了具体的不同的logwriter对象,每个对象可能要记录不同的信息,当错误信息要刷到文件中的时候,会运行每一个Logwriter实例,看看自己是否要记录errormessage中的错误,errormessage中的level不包含在Logwriter内时忽略。
这本分和第一部分怎么合作的呢?其实很简单,当exception捕获的异常时会调用添加一条错误信息(包括错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序结束之后在将这些信息写入文件;
这里还要注意下,也许你在阅读kohana代码是发现没有明显的直接写入到日志中去,这里面kohana优化的比较好,因为php的一次执行可能出现多个错误,如果来一个错误你就去记录一次这样会在程序返回之前占用多余的io和时间;
所以kohana的做法是默认将所有的错误、异常、日志存放在Log::$errormessage中,并在实例化的时候讲Log中的writer操作注册register_shutdown_function,这个函数的作用是在程序异常终止或者执行完成之后执行,前面第一部分也有使用到,这样日志记录就不会对本次php的执行产生带大的影响。
更多PHP相关知识,请访问PHP教程!
Das obige ist der detaillierte Inhalt vonProtokollierungssystem im PHP-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!