PHP架構中的日誌系統,PHP架構日誌系統_PHP教程

來源:互聯網
上載者:User

PHP架構中的日誌系統,PHP架構日誌系統


 

 現在在一家公司做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)這種方式。

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

二、日誌記錄相關類庫

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

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

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

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

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

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

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

三、執行個體總結

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

https://github.com/AizuYan/phplog.git本文著作權歸作者(luluyrt@163.com)和部落格園共有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文串連,否則保留追究法律責任的權利。

http://www.bkjia.com/PHPjc/927207.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/927207.htmlTechArticlePHP架構中的日誌系統,PHP架構日誌系統 現在在一家公司做PHP後台開發程式猿(我們組沒有前端,做活動時會做前端的東西),剛開始到公司...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.