Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Protokollierungssystems im PHP-Framework

Detaillierte Erläuterung des Protokollierungssystems im PHP-Framework

藏色散人
藏色散人nach vorne
2020-03-04 14:13:093263Durchsuche

Einführung

Freunde, die mit dem PHP-Framework vertraut sind, kennen möglicherweise die wichtige Rolle von Protokollen im Projekt. Es kann uns helfen, Fehler zu finden und das Programm benutzerfreundlicher zu gestalten (Wenn Bei richtiger Handhabung wird nicht direkt viel Englisch weggeworfen, das nur Programmierer wirklich verwenden können. Es ist beim Debuggen sehr praktisch und kann auch einige wichtige Vorgänge usw. aufzeichnen. Kurz gesagt, wenn kein vollständiges Projekt vorhanden ist ein Holzsystem. Der Weg zur Entwicklung ist bereits voller Dornen und Schlaglöcher, und es wird definitiv Unebenheiten auf dem Weg geben.

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); //异常捕获自定义处理函数注册 
set_error_handler(callback $error_handler); //错误捕获自定义处理函数注册 
register_shutdown_function(callback $callback); //程序执行时异常终止错误捕获处理函数注册

Diese drei Funktionen bieten Entwicklern viel Autonomie bei der Fehlerbehandlungskontrolle und im Protokollierungssystem Verdienste.

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.

Detaillierte Erläuterung des Protokollierungssystems im PHP-Framework

Fehlerbehandlungsprozess im PHP-Protokollsystem

Dann kommt jetzt das Problem. Diese Funktionen funktionieren normalerweise mit einer Ausnahmebehandlungsbibliothek und einer Fehlerprotokollierungsklasse Die Bibliothek zur Ausnahmebehandlung enthält drei zu registrierende Funktionen. Die Protokollierungsklassenbibliothek wird in $Exception_Handler aufgerufen, um den Speicherort der Protokolldatei aufzuzeichnen und zu platzieren Der Eingang des Programm-Frameworks lautet 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 olivgrünem Hintergrund. Es handelt sich um verschiedene Klassenbibliotheksinstanzen. Der erste Teil ist das Protokollobjekt, das zur Verwaltung einer Liste von Protokollierungsobjekten verwendet wird. das ein oder mehrere Protokollierungsobjekte enthält (dies ist der zweite Teil, diese Protokollierungsobjekte werden tatsächlich zum Aufzeichnen von Protokollen verwendet), und es gibt eine Reihe 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的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:

Detaillierte Erläuterung des Protokollierungssystems im PHP-Framework

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培训

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Protokollierungssystems im PHP-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen