- 論壇徽章:
- 0
|
log4php0.9的詳細(xì)配置實(shí)例說(shuō)明
一、什么是log4php:
log4j在JAVA中可算是大名鼎鼎的日志開(kāi)發(fā)包了,它為apche組織維護(hù)項(xiàng)目,VxR兄使用php來(lái)實(shí)現(xiàn)了log4j的功能, 目前l(fā)og4php已經(jīng)作為log4j的一個(gè)子項(xiàng)目存在,詳細(xì)信息可點(diǎn)擊:http://logging.apache.org/log4php/進(jìn)行查看,另外VxR兄的log4php官方主站為:http://www.vxr.it/log4php/,有興趣的朋友可直接點(diǎn)上邊兩個(gè)網(wǎng)址查看詳細(xì)信息。
下載地址:http://www.vxr.it/log4php/download.html
二、安裝:
本文下載版本為log4php-0.9.tar.gz, 解壓后目錄中有src目錄,將{解壓目錄}/src/log4php/目錄拷貝至你的項(xiàng)目目錄,完成安裝。因?yàn)楸疚氖怯脕?lái)講解log4php的, 所以不相關(guān)目錄都不列出來(lái),把它定義為http://localhost, 項(xiàng)目結(jié)構(gòu)圖如下:- +app/
- + log4php
- + images/
- + logs/
- + js/
- + css/
- - log4php.properties
- - index.php
復(fù)制代碼 三、開(kāi)始使用:
先從最簡(jiǎn)單的來(lái),先來(lái)看看test1.php中的內(nèi)容:
[php]- <?php
- /*1*/ define (LOG4PHP_DIR, "log4php");
- /*2*/ require_once(LOG4PHP_DIR . '/LoggerManager.php');
- /*3*/ $str = "here is test string!";
- /*4*/ echo "這里是PHP的輸出, 與log4php無(wú)關(guān)喲!<br>";
- /*5*/ $logger = LoggerManager::getLogger('test');
- /*6*/ if ("" != $str) {
- $logger->debug("str的值不為空! 它的值為: " . $str . "<br>");
- }
- /*7*/ if (strlen($str) > 4) {
- $logger->debug("str的長(zhǎng)度大于4!" . "<br>");
- }
- /*8*/ LoggerManager::shutdown();
- ?>
復(fù)制代碼 [/php]
程序非常簡(jiǎn)單,來(lái)看看各處標(biāo)記的作用:
1. 定義LOG4PHP_DIR目錄名為log4php, 也就是我們目錄結(jié)構(gòu)中的log4php目錄
2. 包含LoggerManager.php, 它是我們?cè)诔绦蛑兄饕玫降念?lèi),通過(guò)它的getLogger()靜態(tài)方法取得一個(gè)logger類(lèi),在第5處時(shí)使用這個(gè)類(lèi)
3. 定義一個(gè)字串$str, 用來(lái)測(cè)試,在第6與第7處使用條件判斷來(lái)產(chǎn)生logger的debug信息。
4. 這里代表著你的PHP輸出,為了區(qū)別PHP程序輸出與logger輸出信息的不同,在這里先輸出一條信息。
5. 通過(guò)LoggerManager類(lèi)的getLogger()靜態(tài)方法取得一個(gè)logger類(lèi),它的參數(shù)一般為類(lèi)名,這個(gè)信息用來(lái)區(qū)別不同的logger記錄,在這里我們只用到了一個(gè)測(cè)試類(lèi),因此這個(gè)名稱(chēng)我們可以定義為test, 當(dāng)然你也可以定義為test1, test2...
6. 如果$str不為空則輸出一條調(diào)試信息
7. 如果$str的長(zhǎng)度超過(guò)4輸出一條調(diào)試信息
OK,現(xiàn)在我們來(lái)執(zhí)行一下http://localhost/test1.php. 不對(duì),只有4處輸出的語(yǔ)句而沒(méi)有調(diào)試信息!怎么回事?原因是我們還沒(méi)有設(shè)置log4php的配置文件!好,我這里有一個(gè)簡(jiǎn)單的配置文件,代碼如下:
[php]- log4php.rootLogger=DEBUG, A1
- log4php.appender.A1=LoggerAppenderEcho
- log4php.appender.A1.layout=LoggerLayoutSimple
復(fù)制代碼 [/php]
先不用管這些代碼是什么意思,在app目錄中新建立一個(gè)log4php.properties文件,然后將以上的代碼拷貝至這個(gè)文件里,保存。
注意:
1. 這個(gè)文件的文件名必須是log4php.properties,不要寫(xiě)錯(cuò)
2. 這個(gè)文件必需與index.php同級(jí),也就是在app目錄下
OK,執(zhí)行完這一步繼續(xù)執(zhí)行http://localhost/test1.php,
這時(shí)我們將會(huì)看到這樣的代碼:
[php]
這里是PHP的輸出, 與log4php無(wú)關(guān)喲!- DEBUG - str的值不為空! 它的值為: here is test string!
- DEBUG - str的長(zhǎng)度大于4!
復(fù)制代碼 [/php]
看到這里,有人就會(huì)說(shuō)了,為什么上邊會(huì)有兩個(gè)注意的地方?我想把文件名改成log4.txt, 同時(shí)為了方便我還要把它的位置放在另一個(gè)地方,比如我的項(xiàng)目中有一個(gè)專(zhuān)門(mén)的配置文件目錄config/,我想把log4.txt放在config/目錄中, OK, 可以, 如果你這樣做了,那么在test1.php中還需要在1處后邊加一條語(yǔ)句:
[php]- define (LOG4PHP_CONFIGURATION, "/config/log4.txt");
復(fù)制代碼 [/php]
這里要說(shuō)明的一定,因?yàn)閘og4php的屬性文件采用的是properties格式,這種格式在JAVA中一般的擴(kuò)展名為.properties, 因此我們還是將log4.txt的擴(kuò)展名修改為log4.properties, 這樣更符合習(xí)慣一些。log4php也支持XML格式定義的配置文件,不過(guò)一般說(shuō)來(lái)XML文件的可讀性較差,我在這里就統(tǒng)一使用properties格式的配置文件了。
OK,高級(jí)的東西我們放到下邊去看,我們來(lái)看執(zhí)行后的頁(yè)面,好像很簡(jiǎn)單一樣,與echo 沒(méi)什么兩樣,好,我們先不用知道為什么,先將log4.properties中的最后一條log4php.appender.A1.layout的值由LoggerLayoutSimple改為L(zhǎng)oggerLayoutHtml, 保存后再執(zhí)行http://localhost/test1.php看看,哈哈,現(xiàn)在是不是感覺(jué)舒服一些了?也對(duì)得起這自己花這么長(zhǎng)時(shí)間來(lái)看這個(gè)東西了。后邊所謂的高級(jí)使用也就是來(lái)詳細(xì)說(shuō)明這個(gè)配置文件的使用的。通過(guò)配置文件,我們可以使用一些更高級(jí)的功能,例如將日志寫(xiě)成文件等。
四、高級(jí)使用:
Log4php由三個(gè)重要的組件構(gòu)成:日志信息的優(yōu)先級(jí),日志信息的輸出目的地,日志信息的輸出格式。日志信息的優(yōu)先級(jí)從高到低有ERROR、WARN、INFO、DEBUG,分別用來(lái)指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將附加到執(zhí)行文件尾還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。
1. 日志的優(yōu)先級(jí),日志信息有四種分類(lèi)(常用),可以通過(guò)在在配置文件中設(shè)置優(yōu)先級(jí)來(lái)將代碼中出現(xiàn)的調(diào)試信息顯示或隱藏,舉例來(lái)講,當(dāng)我把日志等級(jí)調(diào)整至WARN級(jí)時(shí),那么程序中所出現(xiàn)的ERROR信息(通過(guò)$log->error("error message here!"))及WARN等級(jí)的信息可以記錄出來(lái),而程序中所有使用INFO與DEBUG級(jí)的信息都將不顯示,它由
"log4php.rootLogger=DEBUG, A1"中rootLogger的第一個(gè)參數(shù)定義,這一句的意思是將調(diào)試等級(jí)定義為DEBUG級(jí),也就是說(shuō)程序中所有的ERROR, WARN,INFO, DEBUG信息都可以顯示出來(lái), 如果將等級(jí)設(shè)置為INFO, 那么只能有ERROR, WARN, INFO這三種信息可顯示。
以下是常用四種等級(jí)的用法:
DEBUG Level指出細(xì)粒度信息事件對(duì)調(diào)試應(yīng)用程序是非常有幫助的。
INFO level表明 消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程。
WARN level表明會(huì)出現(xiàn)潛在錯(cuò)誤的情形。
ERROR level指出雖然發(fā)生錯(cuò)誤事件,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
FATAL level指出每個(gè)嚴(yán)重的錯(cuò)誤事件將會(huì)導(dǎo)致應(yīng)用程序的退出。
2. 日志信息的輸出目的地。在log4php中輸出目的地支持12種,分別為:
[php]- 1. LoggerAppenderConsole 以php://stdout為輸出地
- 2. LoggerAppenderDailyFile 繼承自LoggerAppenderFile, 以文件為輸出地,每日輸出一個(gè)文件
- 3. LoggerAppenderDb 以數(shù)據(jù)庫(kù)為輸出地
- 4. LoggerAppenderEcho 在執(zhí)行文件尾輸出
- 5. LoggerAppenderFile 以文件為輸出地
- 6. LoggerAppenderMail 以郵件為輸出地
- 7. LoggerAppenderMailEvent 繼承自LoggerAppenderMail, 以郵件為輸出地, 為事件觸發(fā)
- 8. LoggerAppenderNull: 不輸出任何信息
- 9. LoggerAppenderPhp: 輸出至PHP錯(cuò)誤信息,將各類(lèi)日志等級(jí)信息轉(zhuǎn)化為php標(biāo)準(zhǔn)信息
- 10. LoggerAppenderRollingFile: 繼承自LoggerAppenderFile,以xxx.log.1, xxx.log.2的形式輸出,
- 11. LoggerAppenderSocket: 以socket方式輸出
- 12. LoggerAppenderSyslog: 以系統(tǒng)日志為目的地輸出,使用php中的syslog()函數(shù)進(jìn)行記錄
復(fù)制代碼 [/php]
在配置文件中表現(xiàn)為"log4php.rootLogger=DEBUG, A1" 從第二個(gè)參數(shù)起的別名,具體目的地的設(shè)置方式由:
[php]- log4php.appender.A1=LoggerAppenderEcho
- log4php.appender.A1.layout=LoggerLayoutHtml
復(fù)制代碼 [/php]
來(lái)實(shí)現(xiàn),每種輸出目的地都有不同的設(shè)置參數(shù),根據(jù)實(shí)際需要,輸出的目的地可有多項(xiàng),表現(xiàn)如下:
log4php.rootLogger=DEBUG, A1, A2, A3, ....
其中A1, A2, A3代表不同的輸出目的地。
3. 日志文件輸出格式。它作為輸出目的地的一個(gè)屬性存在,log4php上包含5種不同的輸出方式,分別為:
[php]
1. LoggerLayoutHtml: 以html格式輸出調(diào)試信息
2. LoggerLayoutSimple: 簡(jiǎn)單的以 "等級(jí)信息 - 日志信息"的格式顯示
3. LoggerLayoutTTCC: 以"月/日/年 時(shí)間[進(jìn)程] 等級(jí)信息 日志名稱(chēng) - 調(diào)試信息"的格式來(lái)顯示
4. LoggerPatternLayout: 以模式表達(dá)式作為輸出格式來(lái)顯示(這個(gè)功能極為強(qiáng)悍,你可以隨心所欲的來(lái)設(shè)置輸出格式,在實(shí)例部分詳細(xì)講解)
5. LoggerXmlLayout: 以xml的模式來(lái)輸出
[/php]
這里所謂的高級(jí)使用也就是log4php中的配置文件的使用,所有的高級(jí)功能都要由配置文件來(lái)完成,我每講一個(gè)功能的使用,都有一個(gè)示例文件,大家可以邊看教程邊進(jìn)行調(diào)試, 在這里我將以幾種常見(jiàn)的輸出目的地為例進(jìn)行講解,詳細(xì)的內(nèi)容大家可以查看log4php解壓目錄里的test目錄。
1. LoggerAppenderEcho:定義方式:
[php]- log4php.appender.A1=LoggerAppenderEcho
- log4php.appender.A1.layout=LoggerLayoutHtml
復(fù)制代碼 [/php]
log4php.appender是固定格式,A1代表輸出地的別名,log4php.appender.A1為輸出地,這里為直接回顯,log4php.appender.A1.layout定義直接回顯時(shí)的格式,在這里取值可以是5種輸出格式, 當(dāng)前設(shè)置表示使用HTML來(lái)輸出DEBUG信息,當(dāng)A1的layout配置為L(zhǎng)oggerLayoutHtml后,它還有兩個(gè)附加參數(shù)可定義(請(qǐng)記。哼@里的參數(shù)指的是為L(zhǎng)oggerLayoutHmtl設(shè)置為不是為L(zhǎng)oggerAppenderEcho,是為輸出格式設(shè)置參數(shù)而不是為輸出目的地設(shè)置參數(shù)),分別為:
1. locationInfo: 輸出本地信息,值為boolean
2. title:輸出html的標(biāo)題名,也就是輸出HTML中的<title></title>中的名稱(chēng), 字符串
完整配置示例如下:
[php]- log4php.rootLogger=DEBUG, A1
- log4php.appender.A1=LoggerAppenderEcho
- log4php.appender.A1.layout=LoggerLayoutHtml
- log4php.appender.A1.layout.locationInfo=true
- log4php.appender.A1.layout.title=這里是測(cè)試實(shí)例1
復(fù)制代碼 [/php]
本節(jié)實(shí)例為log_echo.php.
2. LoggerAppenderFile:
定義格式:
[php]- log4php.appender.A1=LoggerAppenderFile
- log4php.appender.A1.layout=LoggerLayoutHtml
復(fù)制代碼 [/php]
同樣,這里表示輸出地為File, 輸出的格式為loggerLayoutHtml. 當(dāng)輸出目的地為L(zhǎng)oggerAppenderFile時(shí)還要進(jìn)行設(shè)置幾個(gè)參數(shù):
1. file: 要輸出的文件名, 字符串
2. append:是否每次記錄時(shí)添加至文件尾部,值為boolean, 為true時(shí)不清除原有數(shù)據(jù),為false時(shí)清除原有記錄。
完整的設(shè)置模式為:
[php]- 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=這里是測(cè)試實(shí)例1
復(fù)制代碼 [/php]
很明顯示,這里的A1.append應(yīng)該設(shè)置為false, 因?yàn)槭荋TML格式輸出,如果為true的話(huà)文件里每次都會(huì)將整個(gè)HTML信息寫(xiě)入。不過(guò)有個(gè)遺憾就是log4php對(duì)中文的支持不是很好,生成的HTML文件title的中文正確,調(diào)試信息的中文全部為亂碼。這一點(diǎn)注意。
本節(jié)實(shí)例為log_file.php.
3. LoggerAppenderDailyFile:
定義格式:
[php]- log4php.rootLogger=DEBUG, A1
- log4php.appender.A1=LoggerAppenderDailyFile
- log4php.appender.A1.layout=LoggerLayoutSimple
復(fù)制代碼 [/php]
通過(guò)設(shè)置log4php.appender.A1的值使用日志文件按時(shí)間輸出,同時(shí)這里的輸出方式選擇最簡(jiǎn)單的LoggerLayoutSimple. 當(dāng)選擇LoggerAppenderDailyFile為輸出目的地時(shí)需要設(shè)置以下幾個(gè)參數(shù):
1. file: 輸出文件名,采用"文件名_%s.log"這樣的形式來(lái)輸出,尾部的%s表示附帶的時(shí)間,時(shí)間的定義格式為下面的參數(shù)
2. datePattern:時(shí)間格式,表示將當(dāng)前日期格式化為字串型代換文件名的中的%s.
完整設(shè)置模式為:
[php]- 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
復(fù)制代碼 [/php]
輸出格式為L(zhǎng)oggerLayoutSimple表示我以簡(jiǎn)單的“[等級(jí)信息] - 調(diào)試信息”這樣的格式寫(xiě)入.
本節(jié)實(shí)例為log_dailyfile.php
4. LoggerAppenderRollingFile:
定義格式:
[php]- log4php.rootLogger=DEBUG, A1
- log4php.appender.A1=LoggerAppenderRollingFile
- log4php.appender.A1.layout=LoggerLayoutSimple
復(fù)制代碼 [/php]
表示按序列號(hào)排列文件,當(dāng)日志文件大小超過(guò)最大定義時(shí)備份舊日志并重寫(xiě)新日志
來(lái)看看它的相關(guān)參數(shù):
1. file: 要輸出的文件名 字符串型
2. maxFileSize: 日志文件最大字節(jié)數(shù) 格式為:數(shù)值k
3. maxBackupIndex: 最大序列數(shù) 為日志文件.后邊的最大數(shù)值 數(shù)值型。
完整體的配置文件如下:
[php]- 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
復(fù)制代碼 [/php]
這里為演示將maxFileSize調(diào)整為5KB, 實(shí)際使用中請(qǐng)按需設(shè)置. 其它可選單位為KB,MB,GB.
本節(jié)實(shí)例為log_rollingfile.php.
5. LoggerPatternLayout輸出格式詳解:
這里我們的輸出目的地設(shè)置為最簡(jiǎn)單的LoggerAppenderEcho, 來(lái)看看如何在layout層使用LoggerPatternLayout:
完整體配置文件:
[php]- 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
復(fù)制代碼 [/php]
關(guān)于conversionPattern中參數(shù)的作用如下:
* c: 當(dāng)前l(fā)ogger名稱(chēng),通過(guò)LoggerManager::getLogger($cateName)傳入的$cateName值
* C: 當(dāng)前的完整體的類(lèi)名稱(chēng)(產(chǎn)生log信息的類(lèi),log4php中類(lèi)名)
* d: 當(dāng)前時(shí)間
* F: 當(dāng)前文件名
* l: 產(chǎn)生日志信息的類(lèi)
* L: 產(chǎn)生日志信息的行數(shù)
* n: 換行
* m: 調(diào)試信息
* M: 產(chǎn)生日志信息的方法名
* p: 日志等級(jí)信息
* r: 執(zhí)行時(shí)間ms數(shù)
* t: 產(chǎn)生日志信息的線(xiàn)程
* x: NDC (nested diagnostic context)
* X: MDC (mapped diagnostic context)
這里0.9的版本中有一個(gè)bug, %F與%L不能正常顯示值,通過(guò)只需要修改log4php\spi\LoggerLoggingEvent.php 189和190行:
[php]- 189 $className = @$hop['class'];
- 190 if ( !empty($className) and ($className == 'logger' or get_parent_class($className) == 'logger') )
復(fù)制代碼 [/php]
更改為以下:
[php]- 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')
復(fù)制代碼 [/php]
(摘自:http://ipis007.spaces.live.com/b ... E274140B!1056.entry, 原作中錯(cuò)誤文件為L(zhǎng)oggerLocationInfo.php, 實(shí)際應(yīng)為L(zhǎng)oggerLoggingEvent.php)
6. 多輸出地設(shè)置:
有了上邊的知道,多輸出地的設(shè)置自然也就明白了,來(lái)看一個(gè)配置文件:
[php]- 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"
復(fù)制代碼 [/php]
相信大家能夠明白上邊的配置文件了,多余的就不說(shuō)了,這里的輸出地別名A1, A2你可以自已定義,你可這樣定義File, Echo...
五 log4php在phpsa框架中的應(yīng)用
phpsa3.0開(kāi)始集成log4php進(jìn)行調(diào)試工作, 框架級(jí)的調(diào)試信息等級(jí)為INFO, 用戶(hù)定義模塊中可以使用DEBUG等級(jí)進(jìn)行輸出日志信息, 想要了解框架的結(jié)構(gòu)時(shí)可將/comm/config/log4php.properties中的log4php.rootLogger的屬性設(shè)置為DEBUG, 默認(rèn)為DEBUG級(jí), 需要指明的是它們的優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG, 如果不想看到系統(tǒng)輸出的debug信息可將調(diào)試等級(jí)設(shè)置為INFO, 在模塊文件中使用$this->logger->info("xxxx")來(lái)輸出info信息.
在phpsa框架中的大多數(shù)類(lèi)都在關(guān)鍵方法中加入deub()日志信息, 用來(lái)記錄框架的執(zhí)行順序. 在Object類(lèi)中l(wèi)ogger進(jìn)行初始化, 在其繼承類(lèi)中進(jìn)行調(diào)用. 框架使用config::IS_LOG來(lái)記錄是否使用log4php, 在實(shí)際的開(kāi)發(fā)中, 我們可以將這個(gè)變量的值設(shè)置為true進(jìn)行日志輸出, 發(fā)布時(shí)要將此值設(shè)置為false以獲得更好的性能.
在Object的構(gòu)造函數(shù)中也使用if語(yǔ)句進(jìn)行類(lèi)庫(kù)的加載與初始化工作:
[php]- if ($this->isLog) {
- require_once ($_SERVER['DOCUMENT_ROOT'] . "/comm/config/phpsaLogger.inc.php");
- $this->logger = LoggerManager::getLogger($this->toString());
- }
復(fù)制代碼 [/php]
在用戶(hù)自定義的模塊中我們可以這樣進(jìn)行初始化:- if (Config::IS_LOG) {
- $this->logger = LoggerManager::getLogger($this->toString());
- }
復(fù)制代碼 這樣調(diào)用:- if (Config::IS_LOG) {
- $this->logger->info("here is debug info...");
- }
復(fù)制代碼 |
|