在開(kāi)發(fā)應(yīng)用的過(guò)程中,調(diào)試也是非常重要的一個(gè)環(huán)節(jié),除了 IDE 支持的即時(shí)調(diào)試(如 VS.PHP 或 IDE 支持的調(diào)試功能),給 Web 應(yīng)用添加適當(dāng)?shù)恼{(diào)試信息也是非常有用的一個(gè)方法,開(kāi)發(fā)過(guò) Java 或.Net 應(yīng)用的對(duì) log4XX 都不陌生,Yii Framework 中也提供了類似的 Log 功能, Yii::log,它是作為 CWebApplication 一個(gè)內(nèi)置的組件出現(xiàn)的??梢酝ㄟ^(guò)配置文件來(lái)配置(Yii 中配置通常為 protected/config/main.php)。
上篇文章 Yii Framework 開(kāi)發(fā)簡(jiǎn)明教程(2) Yii Web應(yīng)用基礎(chǔ)簡(jiǎn)述了應(yīng)用組件。
除 Log 組件外,Yii 預(yù)定義了一系列核心應(yīng)用組件,提供常見(jiàn) Web 應(yīng)用中所用的功能。例如, request 組件用于解析用戶請(qǐng)求并提供例如 URL,cookie 等信息。 通過(guò)配置這些核心組件的屬性,我們可以在幾乎所有的方面修改 Yii 的默認(rèn)行為。
下面我們列出了由 CWebApplication 預(yù)定義的核心組件。
這些組件在后面的教程中將逐步介紹。下面給出 Log 功能使用的基本方法:這里我們修改 Yii Framework 開(kāi)發(fā)簡(jiǎn)明教程(1) 第一個(gè)應(yīng)用Hello World。為其添加日志。
1.創(chuàng)建配置文件 protected/config/main.php
希望將日志寫(xiě)到一個(gè)文件中,可以使用如下配置:
<?php
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
// preloading 'log' component
'preload'=>array('log'),
// application components
'components'=>array(
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'info,error, warning',
),
),
),
),
);
CLogRouter 信息路由 通過(guò) Yii::log 或 Yii::trace 記錄的信息是保存在內(nèi)存中的。 我們通常需要將它們顯示到瀏覽器窗口中,或者將他們保存到一些 持久存儲(chǔ)例如文件、Email 中。這個(gè)就叫作信息路由。 一般使用 Log 功能時(shí),需要預(yù)先載入 Log 組件,這是通過(guò) preload 來(lái)配置的,preload 允許應(yīng)用事先載入一些模塊.提示: 默認(rèn)情況下,應(yīng)用元件是根據(jù)需要而創(chuàng)建的。這意味著一個(gè)元件只有在被訪問(wèn)的情況下才會(huì)創(chuàng)建。 因此,系統(tǒng)的整體性能不會(huì)因?yàn)榕渲昧撕芏嘣陆?。有些?yīng)用元件,(比如 CLogRouter) 是不管用不用都要?jiǎng)?chuàng)建的。在這種情況下, 我們?cè)趹?yīng)用的配置文件里將這些元件的 ID 列上:preload。
2.修改入口腳本 index.php ,配置主應(yīng)用實(shí)例使用新創(chuàng)建的配置文件。
$yii='C:/yiiframework/yii.php';
// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
$config=dirname(__FILE__).'/protected/config/main.php';
require_once($yii);
Yii::createWebApplication($config)->run();
3.創(chuàng)建 protected/runtime
4.這樣就可以使用 Yii::log 或 Yii::trace 為應(yīng)用添加日志。
其區(qū)別是后者只在當(dāng)應(yīng)用程序運(yùn)行在 調(diào)試模式(debug mode) 中時(shí)才會(huì)記錄信息。
Yii::log($message, $level, $category);
Yii::trace($message, $category);
當(dāng)記錄信息時(shí),我們需要指定它的分類和級(jí)別 分類是一段格式類似于 路徑別名 的字符串。 例如,如果一條信息是在 CController 中記錄的,我們可以使用 system.web.CController 作為分類。信息級(jí)別應(yīng)該是下列值中的一種:
Yii 的日志通過(guò) Level 和 Category 進(jìn)行分類和過(guò)濾,正如我們所提到的, 多個(gè)級(jí)別或分類應(yīng)使用逗號(hào)連接。 由于信息分類是類似 xxx.yyy.zzz 格式的,我們可以將其視為一個(gè)分類層級(jí)。 具體地,我們說(shuō) xxx 是 xxx.yyy 的父級(jí),而 xxx.yyy 又是 xxx.yyy.zzz 的父級(jí)。 這樣我們就可以使用 xxx.* 表示分類 xxx 及其所有的子級(jí)和孫級(jí)分類。
有了以上知識(shí),我們修改 SiteController 的 actionIndex,添加一行日志。
public function actionIndex()
{
Yii::log("action","info","site.action");
$this->render("index");
}
5.運(yùn)行應(yīng)用,可以看到 Yii 在 protected/runtime 創(chuàng)建了一個(gè) application.log
http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/3.1.jpg" alt="picture3.1" />
其內(nèi)容如下: 2012/12/11 21:23:38 [info] [site.action] action
注: 日志存放的位置和文件名都可以通過(guò)配置來(lái)修改,一般情況使用缺省值就可以了,和 log4X 類似,應(yīng)用的日志可以通過(guò)路由同時(shí)寫(xiě)到多個(gè)目的地(文件,Email 等)這些多可以通過(guò)配置來(lái)實(shí)現(xiàn),具體可以參見(jiàn)日志記錄。