log4php0.9的詳細配備實例說明

1、什麼是log4php:
log4j在JAVA中可算是大名鼎鼎的日誌開發包了,它爲apche組織維護項目,VxR兄使用php來實現了log4j的功能, 目前log4php已經做爲log4j的一個子項目存在,詳細信息可點擊:http://logging.apache.org/log4php/進行查看,另外VxR兄的log4php官方主站爲:http://www.vxr.it/log4php/,有興趣的朋友可直接點上邊兩個網址查看詳細信息。
下載地址:http://www.vxr.it/log4php/download.html

2、安裝:
本文下載版本爲log4php-0.9.tar.gz, 解壓後目錄中有src目錄,將{解壓目錄}/src/log4php/目錄拷貝至你的項目目錄,完成安裝。由於本文是用來說解log4php的, 因此不相關目錄都不列出來,把它定義爲http://localhost, 項目結構圖以下:
+app/
+ log4php
+ images/
+ logs/
+ js/
+ css/
- log4php.properties
- index.php

3、開始使用:
先從最簡單的來,先來看看test1.php中的內容:
<?php
/*1*/ define (LOG4PHP_DIR, "log4php");

/*2*/ require_once(LOG4PHP_DIR . '/LoggerManager.php');

/*3*/ $str = "here is test string!";

/*4*/ echo "這裏是PHP的輸出, 與log4php無關喲!<br>";

/*5*/ $logger = LoggerManager::getLogger('test');

/*6*/ if ("" != $str) {
$logger->debug("str的值不爲空! 它的值爲: " . $str . "<br>");
}

/*7*/ if (strlen($str) > 4) {
$logger->debug("str的長度大於4!" . "<br>");
}

/*8*/ LoggerManager::shutdown();
?>
程序很是簡單,來看看各處標記的做用:
1. 定義LOG4PHP_DIR目錄名爲log4php, 也就是咱們目錄結構中的log4php目錄
2. 包含LoggerManager.php, 它是咱們在程序中主要用到的類,經過它的getLogger()靜態方法取得一個logger類,在第5處時使用這個類
3. 定義一個字串$str, 用來測試,在第6與第7處使用條件判斷來產生logger的debug信息。
4. 這裏表明着你的PHP輸出,爲了區別PHP程序輸出與logger輸出信息的不一樣,在這裏先輸出一條信息。
5. 經過LoggerManager類的getLogger()靜態方法取得一個logger類,它的參數通常爲類名,這個信息用來區別不一樣的logger記錄,在這裏咱們只用到了一個測試類,所以這個名稱咱們能夠定義爲test, 固然你也能夠定義爲test1, test2...
6. 若是$str不爲空則輸出一條調試信息
7. 若是$str的長度超過4輸出一條調試信息
OK,如今咱們來執行一下http://localhost/test1.php. 不對,只有4處輸出的語句而沒有調試信息!怎麼回事?緣由是咱們尚未設置log4php的配置文件!好,我這裏有一個簡單的配置文件,代碼以下:
log4php.rootLogger=DEBUG, A1
log4php.appender.A1=LoggerAppenderEcho
log4php.appender.A1.layout=LoggerLayoutSimple
先不用管這些代碼是什麼意思,在app目錄中新創建一個log4php.properties文件,而後將以上的代碼拷貝至這個文件裏,保存。
注意:
1. 這個文件的文件名必須是log4php.properties,不要寫錯
2. 這個文件必需與index.php同級,也就是在app目錄下

OK,執行完這一步繼續執行http://localhost/test1.php,
這時咱們將會看到這樣的代碼:
這裏是PHP的輸出, 與log4php無關喲!
DEBUG - str的值不爲空! 它的值爲: here is test string!
DEBUG - str的長度大於4!
看到這裏,有人就會說了,爲何上邊會有兩個注意的地方?我想把文件名改爲log4.txt, 同時爲了方便我還要把它的位置放在另外一個地方,好比個人項目中有一個專門的配置文件目錄config/,我想把log4.txt放在config/目錄中, OK, 能夠, 若是你這樣作了,那麼在test1.php中還須要在1處後邊加一條語句:
define (LOG4PHP_CONFIGURATION, "/config/log4.txt");
這裏要說明的必定,由於log4php的屬性文件採用的是properties格式,這種格式在JAVA中通常的擴展名爲.properties, 所以咱們仍是將log4.txt的擴展名修改成log4.properties, 這樣更符合習慣一些。log4php也支持XML格式定義的配置文件,不過通常說來XML文件的可讀性較差,我在這裏就統一使用properties格式的配置文件了。

OK,高級的東西咱們放到下邊去看,咱們來看執行後的頁面,好像很簡單同樣,與echo 沒什麼兩樣,好,咱們先不用知道爲何,先將log4.properties中的最後一條log4php.appender.A1.layout的值由LoggerLayoutSimple改成LoggerLayoutHtml, 保存後再執行http://localhost/test1.php看看,哈哈,如今是否是感受舒服一些了?也對得起這本身花這麼長時間來看這個東西了。後邊所謂的高級使用也就是來詳細說明這個配置文件的使用的。經過配置文件,咱們可使用一些更高級的功能,例如將日誌寫成文件等。

4、高級使用:
Log4php由三個重要的組件構成:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。日誌信息的優先級從高到低有ERROR、WARN、INFO、DEBUG,分別用來指定這條日誌信息的重要程度;日誌信息的輸出目的地指定了日誌將附加到執行文件尾仍是文件中;而輸出格式則控制了日誌信息的顯示內容。
1. 日誌的優先級,日誌信息有四種分類(經常使用),能夠經過在在配置文件中設置優先級來將代碼中出現的調試信息顯示或隱藏,舉例來說,當我把日誌等級調整至WARN級時,那麼程序中所出現的ERROR信息(經過$log->error("error message here!"))及WARN等級的信息能夠記錄出來,而程序中全部使用INFO與DEBUG級的信息都將不顯示,它由
"log4php.rootLogger=DEBUG, A1"中rootLogger的第一個參數定義,這一句的意思是將調試等級定義爲DEBUG級,也就是說程序中全部的ERROR, WARN,INFO, DEBUG信息均可以顯示出來, 若是將等級設置爲INFO, 那麼只能有ERROR, WARN, INFO這三種信息可顯示。

如下是經常使用四種等級的用法:
DEBUG Level指出細粒度信息事件對調試應用程序是很是有幫助的。
INFO level代表 消息在粗粒度級別上突出強調應用程序的運行過程。
WARN level代表會出現潛在錯誤的情形。
ERROR level指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
FATAL level指出每一個嚴重的錯誤事件將會致使應用程序的退出。

2. 日誌信息的輸出目的地。在log4php中輸出目的地支持12種,分別爲:

1. LoggerAppenderConsole 以php://stdout爲輸出地
2. LoggerAppenderDailyFile 繼承自LoggerAppenderFile, 以文件爲輸出地,每日輸出一個文件
3. LoggerAppenderDb 以數據庫爲輸出地
4. LoggerAppenderEcho 在執行文件尾輸出
5. LoggerAppenderFile 以文件爲輸出地
6. LoggerAppenderMail 以郵件爲輸出地
7. LoggerAppenderMailEvent 繼承自LoggerAppenderMail, 以郵件爲輸出地, 爲事件觸發
8. LoggerAppenderNull: 不輸出任何信息
9. LoggerAppenderPhp: 輸出至PHP錯誤信息,將各種日誌等級信息轉化爲php標準信息
10. LoggerAppenderRollingFile: 繼承自LoggerAppenderFile,以xxx.log.1, xxx.log.2的形式輸出,
11. LoggerAppenderSocket: 以socket方式輸出
12. LoggerAppenderSyslog: 以系統日誌爲目的地輸出,使用php中的syslog()函數進行記錄

在配置文件中表現爲"log4php.rootLogger=DEBUG, A1" 從第二個參數起的別名,具體目的地的設置方式由:
log4php.appender.A1=LoggerAppenderEcho
log4php.appender.A1.layout=LoggerLayoutHtml
來實現,每種輸出目的地都有不一樣的設置參數,根據實際須要,輸出的目的地可有多項,表現以下:
log4php.rootLogger=DEBUG, A1, A2, A3, ....
其中A1, A2, A3表明不一樣的輸出目的地。

3. 日誌文件輸出格式。它做爲輸出目的地的一個屬性存在,log4php上包含5種不一樣的輸出方式,分別爲:

1. LoggerLayoutHtml: 以html格式輸出調試信息
2. LoggerLayoutSimple: 簡單的以 "等級信息 - 日誌信息"的格式顯示
3. LoggerLayoutTTCC: 以"月/日/年 時間[進程] 等級信息 日誌名稱 - 調試信息"的格式來顯示
4. LoggerPatternLayout: 以模式表達式做爲輸出格式來顯示(這個功能極爲強悍,你能夠爲所欲爲的來設置輸出格式,在實例部分詳細講解)
5. LoggerXmlLayout: 以xml的模式來輸出

這裏所謂的高級使用也就是log4php中的配置文件的使用,全部的高級功能都要由配置文件來完成,我每講一個功能的使用,都有一個示例文件,你們能夠邊看教程邊進行調試, 在這裏我將以幾種常見的輸出目的地爲例進行講解,詳細的內容你們能夠查看log4php解壓目錄裏的test目錄。

1. LoggerAppenderEcho:定義方式:
log4php.appender.A1=LoggerAppenderEcho
log4php.appender.A1.layout=LoggerLayoutHtml
log4php.appender是固定格式,A1表明輸出地的別名,log4php.appender.A1爲輸出地,這裏爲直接回顯,log4php.appender.A1.layout定義直接回顯時的格式,在這裏取值能夠是5種輸出格式, 當前設置表示使用HTML來輸出DEBUG信息,當A1的layout配置爲LoggerLayoutHtml後,它還有兩個附加參數可定義(請記住:這裏的參數指的是爲LoggerLayoutHmtl設置爲不是爲LoggerAppenderEcho,是爲輸出格式設置參數而不是爲輸出目的地設置參數),分別爲:
1. locationInfo: 輸出本地信息,值爲boolean
2. title:輸出html的標題名,也就是輸出HTML中的<title></title>中的名稱,字符串

完整配置示例以下:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderEcho

log4php.appender.A1.layout=LoggerLayoutHtml
log4php.appender.A1.layout.locationInfo=true
log4php.appender.A1.layout.title=這裏是測試實例1
本節實例爲log_echo.php.


2. LoggerAppenderFile:
定義格式:
log4php.appender.A1=LoggerAppenderFile
log4php.appender.A1.layout=LoggerLayoutHtml
一樣,這裏表示輸出地爲File, 輸出的格式爲loggerLayoutHtml. 當輸出目的地爲LoggerAppenderFile時還要進行設置幾個參數:
1. file: 要輸出的文件名, 字符串
2. append:是否每次記錄時添加至文件尾部,值爲boolean, 爲true時不清除原有數據,爲false時清除原有記錄。
完整的設置模式爲:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderFile
log4php.appender.A1.file=logs/log4php_file.log.html
log4php.appender.A1.append=false

log4php.appender.A1.layout=LoggerLayoutHtml
log4php.appender.A1.layout.locationInfo=true
log4php.appender.A1.layout.title=這裏是測試實例1
很明顯示,這裏的A1.append應該設置爲false, 由於是HTML格式輸出,若是爲true的話文件裏每次都會將整個HTML信息寫入。不過有個遺憾就是log4php對中文的支持不是很好,生成的HTML文件title的中文正確,調試信息的中文所有爲亂碼。這一點注意。
本節實例爲log_file.php.


3. LoggerAppenderDailyFile:
定義格式:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderDailyFile

log4php.appender.A1.layout=LoggerLayoutSimple
經過設置log4php.appender.A1的值使用日誌文件按時間輸出,同時這裏的輸出方式選擇最簡單的LoggerLayoutSimple. 當選擇LoggerAppenderDailyFile爲輸出目的地時須要設置如下幾個參數:
1. file: 輸出文件名,採用"文件名_%s.log"這樣的形式來輸出,尾部的%s表示附帶的時間,時間的定義格式爲下面的參數
2. datePattern:時間格式,表示將當前日期格式化爲字串型代換文件名的中的%s.
完整設置模式爲:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderDailyFile
log4php.appender.A1.datePattern=Ymd
log4php.appender.A1.file=logs/log4php_dailyfile_%s.log
log4php.appender.A1.append=true

log4php.appender.A1.layout=LoggerLayoutSimple
輸出格式爲LoggerLayoutSimple表示我以簡單的「[等級信息] - 調試信息」這樣的格式寫入.
本節實例爲log_dailyfile.php

4. LoggerAppenderRollingFile:
定義格式:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderRollingFile

log4php.appender.A1.layout=LoggerLayoutSimple
表示按序列號排列文件,當日志文件大小超過最大定義時備份舊日誌並重寫新日誌
來看看它的相關參數:
1. file: 要輸出的文件名 字符串型
2. maxFileSize: 日誌文件最大字節數 格式爲:數值k
3. maxBackupIndex: 最大序列數 爲日誌文件.後邊的最大數值 數值型。

完總體的配置文件以下:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderRollingFile
log4php.appender.A1.file=logs/log4php_rollingfile.log
log4php.appender.A1.maxFileSize=5KB
log4php.appender.A1.maxBackupIndex=5

log4php.appender.A1.layout=LoggerLayoutSimple
這裏爲演示將maxFileSize調整爲5KB, 實際使用中請按需設置. 其它可選單位爲KB,MB,GB.
本節實例爲log_rollingfile.php.


5. LoggerPatternLayout輸出格式詳解:
這裏咱們的輸出目的地設置爲最簡單的LoggerAppenderEcho, 來看看如何在layout層使用LoggerPatternLayout:
完總體配置文件:
log4php.rootLogger=DEBUG, A1

log4php.appender.A1=LoggerAppenderEcho

log4php.appender.A1.layout=LoggerPatternLayout
log4php.appender.A1.layout.conversionPattern=%-5p %d %t %m in %F line %L%n
關於conversionPattern中參數的做用以下:
* c: 當前logger名稱,經過LoggerManager::getLogger($cateName)傳入的$cateName值
* C: 當前的完總體的類名稱(產生log信息的類,log4php中類名)
* d: 當前時間
* F: 當前文件名
* l: 產生日誌信息的類
* L: 產生日誌信息的行數
* n: 換行
* m: 調試信息
* M: 產生日誌信息的方法名
* p: 日誌等級信息
* r: 執行時間ms數
* t: 產生日誌信息的線程
* x: NDC (nested diagnostic context)
* X: MDC (mapped diagnostic context)
這裏0.9的版本中有一個bug, %F與%L不能正常顯示值,經過只須要修改log4php\spi\LoggerLoggingEvent.php 189和190行:
189 $className = @$hop['class'];
190 if ( !empty($className) and ($className == 'logger' or get_parent_class($className) == 'logger') )
更改成如下:
189 $className = @strtolower($hop['class']);
190 if ( !empty($className) and ($className == 'logger' or $className == 'loggercategory' or get_parent_class($className) == 'logger') or get_parent_class($className) == 'loggercategory')
(摘自:http://ipis007.spaces.live.com/blog/cns!75F0E4FEE274140B!1056.entry, 原做中錯誤文件爲LoggerLocationInfo.php, 實際應爲LoggerLoggingEvent.php)


6. 多輸出地設置:
有了上邊的知道,多輸出地的設置天然也就明白了,來看一個配置文件:
log4php.rootLogger=DEBUG, A1, A2

log4php.appender.A1=LoggerAppenderEcho
log4php.appender.A1.layout=LoggerPatternLayout
log4php.appender.A1.layout.conversionPattern="%-5p %l %d %c %t %m in %F line %L%n"

log4php.appender.A2=LoggerAppenderFile
log4php.appender.A2.file=logs/log4php_mutil.log
log4php.appender.A2.append=false
log4php.appender.A2.layout=LoggerPatternLayout
log4php.appender.A2.layout.conversionPattern="%-5p %l %d %c %t %m in %F line %L%n"
相信你們可以明白上邊的配置文件了,多餘的就不說了,這裏的輸出地別名A1, A2你能夠自已定義,你可這樣定義File, Echo...


五 log4php在phpsa框架中的應用
phpsa3.0開始集成log4php進行調試工做, 框架級的調試信息等級爲INFO, 用戶定義模塊中可使用DEBUG等級進行輸出日誌信息, 想要了解框架的結構時可將/comm/config/log4php.properties中的log4php.rootLogger的屬性設置爲DEBUG, 默認爲DEBUG級, 須要指明的是它們的優先級從高到低分別是ERROR、WARN、INFO、DEBUG, 若是不想看到系統輸出的debug信息可將調試等級設置爲INFO, 在模塊文件中使用$this->logger->info("xxxx")來輸出info信息.
在phpsa框架中的大多數類都在關鍵方法中加入deub()日誌信息, 用來記錄框架的執行順序. 在Object類中logger進行初始化, 在其繼承類中進行調用. 框架使用config::IS_LOG來記錄是否使用log4php, 在實際的開發中, 咱們能夠將這個變量的值設置爲true進行日誌輸出, 發佈時要將此值設置爲false以得到更好的性能.
在Object的構造函數中也使用if語句進行類庫的加載與初始化工做:
if ($this->isLog) {
require_once ($_SERVER['DOCUMENT_ROOT'] . "/comm/config/phpsaLogger.inc.php");
$this->logger = LoggerManager::getLogger($this->toString());
}
在用戶自定義的模塊中咱們能夠這樣進行初始化:
if (Config::IS_LOG) {
$this->logger = LoggerManager::getLogger($this->toString());
}
這樣調用:
if (Config::IS_LOG) {
$this->logger->info("here is debug info...");
} 
/*
//const LOG4PHP=true;
//const LOG4PHP_DEFAULT_INIT_OVERRIDE = true;
//const LOG4PHP_CONFIGURATION_FILE = '';
define (LOG4PHP_DIR, LIB_PATH.'log4php-0.9/src/log4php');
define (LOG4PHP_CONFIGURATION, C_PATH . 'log4php.win.properties');
require_once (LOG4PHP_DIR . '/LoggerManager.php');

$logger = LoggerManager::getLogger($category);
$logger->$level($msg);
*/

參考官網的手冊: http://logging.apache.org/log4php/docs/configuration.html
相關文章
相關標籤/搜索