首頁 > 後端開發 > php教程 > PHP框架中的日誌系統

PHP框架中的日誌系統

WBOY
發布: 2016-08-08 09:32:35
原創
1452 人瀏覽過

 

 現在在一家公司做PHP後台開發程式猿(我們組沒有前端,做活動時會做前端的東西),剛開始到公司的時候花2個週趕出了一個前端加後台的活動(記得當時做不出來週末加了兩天班、、、),到現在過去4個多月了,可以用一下午秒掉一個不是很複雜的活動,當然了現在做的時候會考慮很多東西,比如說擴展性、可重複使用性,因為做的多了,會累積很多類似小插件的東西,所以會很快。 。 。 。 。 。但是我發現整天「站在需求裡面做需求」很差勁,這樣不會學到系統的、框架類的東西,因為都被瑣碎的需求給困住了,沒有時間去做一些框架重要部分的東西,而且當你的同事、上司習慣了你去做那些事的時候,每次遇到那些沒技術含量的但又不得不做的東西都會毫不猶豫的推給你(自私點的說,每個程序猿都跟我一樣吧,都想掌握一塊有技術含量的東西,這樣才有程序猿的自豪感),久而久之你就會習慣、、、、、、這樣真的很慘,所以,我會抽出點時間來學習下框架中的東西,爭取不做一個簡單的碼農。

引言

    接觸過php框架的朋友們可能都知道,日誌在專案中的重要作用了,他可以幫助我們定位錯誤的位置,讓程式更友善(處理得當的話不會直接拋出一大堆只有程式猿才真正動的英文),調試的時候也會很方便,還可以記錄一些重要的操作等等,總之一個完整的項目要是沒了日誌系統,就已經開發的路上佈滿了荊棘、坑洼,肯定會磕磕絆絆的。

 

簡介

    要掌握PHP日誌系統,必須先對這幾點了解透徹。

一、php的幾個函數

 1 set_exception_handler(callback $exception_handler); //異常捕獲自定義處理函數註冊自白  

1

set_error_handler(callback $error_handler); //錯誤捕捉自訂處理函數註冊  1 register_shutdown_function

(

callback $callback); //     這三個函數在錯誤處理控制中給開發者提供了很大的自主空間,在日誌系統中記錄日誌資訊有他們的功勞。     在程式中出現異常(exception)問題時,php核心會拋出異常錯誤,然後將錯誤訊息列印給使用者,如果註冊了exception處理函數,php拋出的異常會轉給自訂的註冊的異常捕獲函數,這個函數裡麵包含了我們要做的處理,記錄錯誤訊息(包括錯誤詳細內容、錯誤位置),該函數處理完異常後,異常就會終止。     當程式中出現error時,我們註冊的error處理函數會在函數中將錯誤訊息轉換為一個錯誤異常物件傳遞給異常處理函數,也就是第一步的$exception_handler函數。

    當成續重出現shutdown錯誤時,會執行我們註冊的異常終止處理函數,該函數透過error_get_last()取得到最後的shutdown時的錯誤對象,接著和上一部一樣,產生一個error exception對象,將該物件傳遞給我們註冊的異常處理函數。

    可以看到,其實不管是異常還是錯誤,都是將自己的信息轉化為異常處理函數認識的異常信息,然後交給異常處理函數處理,非異常信息就像化了妝的女人一樣,異常處理程序不認識這些非異常訊息,只有將裝卸掉(非異常訊息自己轉化為異常訊息,準確的說應該是拋出),異常處理才認識。

php日誌系統中的錯誤處理流程

    那麼現在問題來了,這幾個函數通常會配合一個異常處理類別庫,加上一個錯誤日誌記錄類別庫來進行工作,異常處理類別庫中包含要註冊的3個函數,日誌記錄類別庫在$exception_handler中調用,用來合理的記錄和放置日誌檔案的位置,上面說到的幾個函數一般是在程式框架入口處進行載入註冊的,就像下面這樣:

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

<span>1</span> <span>set_exception_handler</span>(<span>array</span>("Myexception","exceptionHandler"<span>));
</span><span>2</span> <span>set_error_handler</span>(<span>array</span>("Myexception","errorHandler"<span>));
</span><span>3</span> <span>register_shutdown_function</span>(<span>array</span>("Myexception","shutdownHandler"));
登入後複製

二、日誌記錄相關類別庫

    第一部分介紹到的東西只是對異常、錯誤、shutdown進行了捕獲,這只是第一步,接下來還要對捕獲到的信息進行合理的處理,比如說記錄這些日誌信息到本地文件系統中(這個操作是在array("Myexception","exceptionHandler")),這個地方就用到了日誌記錄類別庫。 (下面要說的類別庫是藉用了kohana日誌系統的設計)。

    日式日誌記錄也很簡單只要做的將信息添加到文件末尾就行,這個很容易實現,相信大家都可以自己實現,但是要設計出一個便捷的、高效的、擴展的日誌記錄類庫就不那麼簡單了,要經過長時間的實踐總結優化才可以,kohana框架中的日誌記錄類別庫已經比較成熟了,因此這裡拿來借鑒。

    相信使用過kohana的使用者一定對kohana框架中的日誌記錄比較熟悉,不熟悉也沒關係,我下面會大概的說說,在kohana源碼中的application/bootstrap.php檔案中的第109—— 112行可以看到下面的程式碼:

<span>109</span> <span>/*</span><span>*
</span><span>110</span> <span> * Attach the file write to logging. Multiple writers are supported.
</span><span>111</span>  <span>*/</span>
<span>112</span> Kohana::<span>$log</span>->attach(<span>new</span> Log_File(APPPATH.'logs'));
登入後複製

    這個就是增加一個日誌記錄物件日誌物件中,注意橄欖色打底的兩個,他們是不同的類別庫實例,在kohana中,日誌記錄物件分為兩部分,第一部分就是日誌對象,用來維護一個日誌記錄對象的列表,這個要怎麼理解呢,其實就像一個容器,裡麵包含了一個或多個日誌記錄對象(這個就是第二部分,這些日誌記錄對象才是真正來記錄日誌的),還有每個物件要記錄的錯誤等級的數組,當滿足錯誤等級的時候才會去記錄,不滿足就會略掉。以下是我自己簡化重命名後的日誌記錄方式:

<span>1</span> self::<span>$log</span> = <span>Log</span>::<span>instance();
</span><span>2</span> self::<span>$log</span>->attach(<span>new</span> Logwriter("./data/debug"),<span>Log</span>::<span>DEBUG);
</span><span>3</span> self::<span>$log</span>->attach(<span>new</span> Logwriter("./data/notice"),<span>Log</span>::NOTICE);
登入後複製

    我這裡面為了更好地理解,將「容器」命名為Log,記錄的實例命名為Logwriter,可以看到我在程式入口處很容易的添加了兩不同的日誌種類,第一個是記錄所有錯誤編號比Log::DEBUG小的錯誤(錯誤等級比他高),並依規則記錄在資料夾./data/debug下面,第二個是記錄等級等於或高於Log::NOTICE的錯誤,當然了你還可以更詳細制定具體哪些錯誤好,傳遞數組就行了,這個就是我感覺方便、快捷的地方,我們可以根據需求來添加錯誤日誌、分不同的日誌目錄,下面看一幅圖也許會有助於理解:

                                                                        

    透過上面的圖你就會看到Log是一個容器,包含了具體的不同的logwriter對象,每個對象可能要記錄不同的信息,當錯誤信息要刷到文件中的時候,會運行每一個Logwriter實例,看看自己是否要記錄errormessage中的錯誤,errormessage中的level不包含在Logwriter內時忽略。

    這本分和第一部分怎麼合作的呢?其實很簡單,當exception捕獲的異常時會呼叫添加一條錯誤訊息(包括錯誤位置、錯誤代號、錯誤訊息等資訊)到Log容器中的errormessage數組中,然後當程式結束後在將這些資訊寫入文件,這裡還要注意下,也許你在閱讀kohana程式碼是發現沒有明顯的直接寫入到日誌中去,這裡面kohana優化的比較好,因為php的一次執行可能出現多個錯誤,如果來一個錯誤你就去記錄一次這樣會在程式返回之前佔用多餘的io和時間,所以kohana的做法是默認將所有的錯誤、異常、日誌存放在Log::$errormessage中,並在實例化的時候講Log中的writer操作註冊register_shutdown_function,這個函數的作用是在程式異常終止或執行完成之後執行,前面第一部分也有使用到,這樣日誌記錄就不會對本次php的執行產生帶大的影響。

三、實例總結

    到這裡你應該已經了解了日誌系統的大概了,已經可以自己寫一個」日誌系統」來使用了,下面看看我的」日誌系統「的例子,這是github位址,裡面有程式碼和例子,需要的話可以看看。

https://github.com/AizuYan/phplog.git

本文版權歸作者(luluyrt@163.com)和博客園共有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。

以上就介紹了PHP框架中的日誌系統,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板