溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP 框架中的日志系統(tǒng)

發(fā)布時(shí)間:2020-11-06 13:59:45 來(lái)源:億速云 閱讀:140 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了PHP 框架中的日志系統(tǒng),具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

引言

接觸過(guò)php框架的朋友們可能都知道,日志在項(xiàng)目中的重要作用了,他可以幫助我們定位錯(cuò)誤的位置,讓程序更友好(處理得當(dāng)?shù)脑挷粫?huì)直接拋出一大堆只有程序猿才真正動(dòng)的英文),調(diào)試的時(shí)候也會(huì)很方便,還可以記錄一些重要的操作等等,總之一個(gè)完整的項(xiàng)目要是沒(méi)了日志系統(tǒng),就已經(jīng)開(kāi)發(fā)的路上布滿了荊棘、坑洼,肯定會(huì)磕磕絆絆的。

簡(jiǎn)介

要掌握PHP日志系統(tǒng),必須先對(duì)這幾點(diǎn)東西了解透徹。

一、php的幾個(gè)函數(shù)

set_exception_handler(callback $exception_handler); //異常捕獲自定義處理函數(shù)注冊(cè)

set_error_handler(callback $error_handler); //錯(cuò)誤捕獲自定義處理函數(shù)注冊(cè)

register_shutdown_function(callback $callback); //程序執(zhí)行時(shí)異常終止錯(cuò)誤捕獲處理函數(shù)注冊(cè)

這三個(gè)函數(shù)在錯(cuò)誤處理控制中給開(kāi)發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。

在程序中出現(xiàn)異常(exception)問(wèn)題時(shí),php內(nèi)核會(huì)拋出異常錯(cuò)誤,然后將錯(cuò)誤信息打印給使用者,如果注冊(cè)了exception處理函數(shù),php拋出的異常會(huì)轉(zhuǎn)給自定義的注冊(cè)的異常捕獲函數(shù),這個(gè)函數(shù)里面包含了我們要做的處理,記錄錯(cuò)誤信息(包括錯(cuò)誤詳細(xì)內(nèi)容、錯(cuò)誤位置),該函數(shù)處理完異常后,異常就會(huì)終止。

當(dāng)程序中出現(xiàn)error時(shí),我們注冊(cè)的error處理函數(shù)會(huì)在函數(shù)中將錯(cuò)誤信息轉(zhuǎn)化為一個(gè)錯(cuò)誤異常對(duì)象傳遞給異常處理函數(shù),也就是第一步的$exception_handler函數(shù)。

當(dāng)成續(xù)重出現(xiàn)shutdown錯(cuò)誤時(shí),會(huì)執(zhí)行我們注冊(cè)的異常終止處理函數(shù),該函數(shù)通過(guò)error_get_last()獲取到最后的shutdown時(shí)的錯(cuò)誤對(duì)象,接著和上一部一樣,生成一個(gè)error exception對(duì)象,將該對(duì)象傳遞給我們注冊(cè)的異常處理函數(shù)。

可以看到,其實(shí)不管是異常還是錯(cuò)誤,都是將自己的信息轉(zhuǎn)化為異常處理函數(shù)認(rèn)識(shí)的異常信息,然后交給異常處理函數(shù)處理,非異常信息就像化了妝的女人一樣,異常處理程序不認(rèn)識(shí)這些非異常信息,只有將裝卸掉(非異常信息自己轉(zhuǎn)化為異常信息,準(zhǔn)確的說(shuō)應(yīng)該是拋出),異常處理才認(rèn)識(shí)。

PHP 框架中的日志系統(tǒng)

php日志系統(tǒng)中的錯(cuò)誤處理流程

那么現(xiàn)在問(wèn)題來(lái)了,這幾個(gè)函數(shù)一般會(huì)配合一個(gè)異常處理類庫(kù),加上一個(gè)錯(cuò)誤日志記錄類庫(kù)來(lái)進(jìn)行工作,異常處理類庫(kù)中包含要注冊(cè)的3個(gè)函數(shù),日志記錄類庫(kù)在$exception_handler中調(diào)用,用來(lái)合理的記錄和放置日志文件的位置,上面說(shuō)到的幾個(gè)函數(shù)一般是在程序框架入口處進(jìn)行加載注冊(cè)的,就像下面這樣:

這里面用的是array(class,function)這種方式。

set_exception_handler(array("Myexception","exceptionHandler"));
set_error_handler(array("Myexception","errorHandler"));
register_shutdown_function(array("Myexception","shutdownHandler"));

二、日志記錄相關(guān)類庫(kù)

第一部分介紹到的東西只是對(duì)異常、錯(cuò)誤、shutdown進(jìn)行了捕獲,這只是第一步,接下來(lái)還要對(duì)捕獲到的信息進(jìn)行合理的處理,比如說(shuō)記錄這些日志信息到本地文件系統(tǒng)中(這個(gè)操作是在array(“Myexception”,”exceptionHandler”)),這個(gè)地方就用到了日志記錄類庫(kù)。(下面要說(shuō)的類庫(kù)是借鑒了kohana日志系統(tǒng)的設(shè)計(jì))。

日式日志記錄也很簡(jiǎn)單只要做的將信息添加到文件末尾就行,這個(gè)很容易實(shí)現(xiàn),相信大家都可以自己實(shí)現(xiàn),但是要設(shè)計(jì)出一個(gè)便捷的、高效的、擴(kuò)展的日志記錄類庫(kù)就不那么簡(jiǎn)單了,要經(jīng)過(guò)長(zhǎng)時(shí)間的實(shí)踐總結(jié)優(yōu)化才可以,kohana框架中的日志記錄類庫(kù)已經(jīng)比較成熟了,因此這里拿來(lái)借鑒。

相信使用過(guò)kohana的用戶一定對(duì)kohana框架中的日志記錄比較熟悉,不熟悉也沒(méi)關(guān)系,我下面會(huì)大概的說(shuō)說(shuō),在kohana源碼中的application/bootstrap.php文件中的第109——112行可以看到下面的代碼:

/**
* Attach the file write to logging. Multiple writers are supported.
*/
Kohana::$log->attach(new Log_File(APPPATH.'logs'));

這個(gè)就是添加一個(gè)日志記錄對(duì)象到日志對(duì)象中,注意橄欖色打底的倆個(gè),他們是不同的類庫(kù)實(shí)例,在kohana中,日志記錄對(duì)象分為兩部分,第一部分就是日志對(duì)象,用來(lái)維護(hù)一個(gè)日志記錄對(duì)象的列表,這個(gè)要怎么理解呢,其實(shí)就像一個(gè)容器,里面包含了一個(gè)或多個(gè)日志記錄對(duì)象(這個(gè)就是第二部分,這些日志記錄對(duì)象才是真正來(lái)記錄日志的),還有每個(gè)對(duì)象要記錄的錯(cuò)誤等級(jí)的數(shù)組,當(dāng)滿足錯(cuò)誤等級(jí)的時(shí)候才會(huì)去記錄,不滿足就會(huì)略掉。下面是我自己簡(jiǎn)化重命名后的日志記錄方式:

self::$log = Log::instance();
self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG);
self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);

我這里面為了更好地理解,將“容器”命名為L(zhǎng)og,記錄的實(shí)例命名為L(zhǎng)ogwriter,可以看到我在程序入口處很容易的添加了兩不同的日志種類,第一個(gè)是記錄所有錯(cuò)誤號(hào)比Log::DEBUG小的錯(cuò)誤(錯(cuò)誤級(jí)別比他高),并按規(guī)則記錄在文件夾./data/debug下面;

第二個(gè)是記錄級(jí)別等于或高于Log::NOTICE的錯(cuò)誤,當(dāng)然了你還可以更詳細(xì)制定具體哪些錯(cuò)誤好,傳遞數(shù)組就行了,這個(gè)就是我感覺(jué)方便、快捷的地方,我們可以根據(jù)需求來(lái)添加錯(cuò)誤日志、分不同的日志目錄,下面看一幅圖也許會(huì)有助于理解:

PHP 框架中的日志系統(tǒng)

log與logwriter的關(guān)系

通過(guò)上面的圖你就會(huì)看到Log是一個(gè)容器,包含了具體的不同的logwriter對(duì)象,每個(gè)對(duì)象可能要記錄不同的信息,當(dāng)錯(cuò)誤信息要刷到文件中的時(shí)候,會(huì)運(yùn)行每一個(gè)Logwriter實(shí)例,看看自己是否要記錄errormessage中的錯(cuò)誤,errormessage中的level不包含在Logwriter內(nèi)時(shí)忽略。

這本分和第一部分怎么合作的呢?其實(shí)很簡(jiǎn)單,當(dāng)exception捕獲的異常時(shí)會(huì)調(diào)用添加一條錯(cuò)誤信息(包括錯(cuò)誤位置、錯(cuò)誤代號(hào)、錯(cuò)誤信息等信息)到Log容器中的errormessage數(shù)組中,然后當(dāng)程序結(jié)束之后在將這些信息寫入文件;

這里還要注意下,也許你在閱讀kohana代碼是發(fā)現(xiàn)沒(méi)有明顯的直接寫入到日志中去,這里面kohana優(yōu)化的比較好,因?yàn)閜hp的一次執(zhí)行可能出現(xiàn)多個(gè)錯(cuò)誤,如果來(lái)一個(gè)錯(cuò)誤你就去記錄一次這樣會(huì)在程序返回之前占用多余的io和時(shí)間;

所以kohana的做法是默認(rèn)將所有的錯(cuò)誤、異常、日志存放在Log::$errormessage中,并在實(shí)例化的時(shí)候講Log中的writer操作注冊(cè)register_shutdown_function,這個(gè)函數(shù)的作用是在程序異常終止或者執(zhí)行完成之后執(zhí)行,前面第一部分也有使用到,這樣日志記錄就不會(huì)對(duì)本次php的執(zhí)行產(chǎn)生帶大的影響。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享PHP 框架中的日志系統(tǒng)內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI