在開發(fā)應(yīng)用的過程中,調(diào)試也是非常重要的一個環(huán)節(jié),除了 IDE 支持的即時調(diào)試(如 VS.PHP 或 IDE 支持的調(diào)試功能),給 Web 應(yīng)用添加適當?shù)恼{(diào)試信息也是非常有用的一個方法,開發(fā)過 Java 或.Net 應(yīng)用的對 log4XX 都不陌生,Yii Framework 中也提供了類似的 Log 功能, Yii::log,它是作為 CWebApplication 一個內(nèi)置的組件出現(xiàn)的??梢酝ㄟ^配置文件來配置(Yii 中配置通常為 protected/config/main.php)。
上篇文章 Yii Framework 開發(fā)簡明教程(2) Yii Web應(yīng)用基礎(chǔ)簡述了應(yīng)用組件。
除 Log 組件外,Yii 預(yù)定義了一系列核心應(yīng)用組件,提供常見 Web 應(yīng)用中所用的功能。例如, request 組件用于解析用戶請求并提供例如 URL,cookie 等信息。 通過配置這些核心組件的屬性,我們可以在幾乎所有的方面修改 Yii 的默認行為。
下面我們列出了由 CWebApplication 預(yù)定義的核心組件。
這些組件在后面的教程中將逐步介紹。下面給出 Log 功能使用的基本方法:這里我們修改 Yii Framework 開發(fā)簡明教程(1) 第一個應(yīng)用Hello World。為其添加日志。
1.創(chuàng)建配置文件 protected/config/main.php
希望將日志寫到一個文件中,可以使用如下配置:
<?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 信息路由 通過 Yii::log 或 Yii::trace 記錄的信息是保存在內(nèi)存中的。 我們通常需要將它們顯示到瀏覽器窗口中,或者將他們保存到一些 持久存儲例如文件、Email 中。這個就叫作信息路由。 一般使用 Log 功能時,需要預(yù)先載入 Log 組件,這是通過 preload 來配置的,preload 允許應(yīng)用事先載入一些模塊.提示: 默認情況下,應(yīng)用元件是根據(jù)需要而創(chuàng)建的。這意味著一個元件只有在被訪問的情況下才會創(chuàng)建。 因此,系統(tǒng)的整體性能不會因為配置了很多元件而下降。有些應(yīng)用元件,(比如 CLogRouter) 是不管用不用都要創(chuàng)建的。在這種情況下, 我們在應(yīng)用的配置文件里將這些元件的 ID 列上:preload。
2.修改入口腳本 index.php ,配置主應(yīng)用實例使用新創(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ū)別是后者只在當應(yīng)用程序運行在 調(diào)試模式(debug mode) 中時才會記錄信息。
Yii::log($message, $level, $category);
Yii::trace($message, $category);
當記錄信息時,我們需要指定它的分類和級別 分類是一段格式類似于 路徑別名 的字符串。 例如,如果一條信息是在 CController 中記錄的,我們可以使用 system.web.CController 作為分類。信息級別應(yīng)該是下列值中的一種:
Yii 的日志通過 Level 和 Category 進行分類和過濾,正如我們所提到的, 多個級別或分類應(yīng)使用逗號連接。 由于信息分類是類似 xxx.yyy.zzz 格式的,我們可以將其視為一個分類層級。 具體地,我們說 xxx 是 xxx.yyy 的父級,而 xxx.yyy 又是 xxx.yyy.zzz 的父級。 這樣我們就可以使用 xxx.* 表示分類 xxx 及其所有的子級和孫級分類。
有了以上知識,我們修改 SiteController 的 actionIndex,添加一行日志。
public function actionIndex()
{
Yii::log("action","info","site.action");
$this->render("index");
}
5.運行應(yīng)用,可以看到 Yii 在 protected/runtime 創(chuàng)建了一個 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
注: 日志存放的位置和文件名都可以通過配置來修改,一般情況使用缺省值就可以了,和 log4X 類似,應(yīng)用的日志可以通過路由同時寫到多個目的地(文件,Email 等)這些多可以通過配置來實現(xiàn),具體可以參見日志記錄。