Yii 提供了一個靈活可擴展的日志功能。記錄的日志 可以通過日志級別和信息分類進行歸類。通過使用 級別和分類過濾器,所選的信息還可以進一步路由到 不同的目的地,例如一個文件,Email,瀏覽器窗口等。
信息可以通過 Yii::log 或 Yii::trace 記錄。其 區別是后者只在當應用程序運行在 調試模式(debug mode) 中時才會記錄信息。
Yii::log($message, $level, $category); Yii::trace($message, $category);
當記錄信息時,我們需要指定它的分類和級別 分類是一段格式類似於 路徑別名 的字符串。 例如,如果一條信息是在 CController 中記錄的,我們可以使用 system.web.CController
作為分類。信息級別應該是下列值中的一種:
-
trace
: 這是在 Yii::trace 中使用的級別。它用於在開發中 跟蹤程序的執行流程。 -
info
: 這個用於記錄普通的信息。 -
profile
: 這個是性能概述(profile)。下面馬上會有更詳細的說明。 -
warning
: 這個用於警告(warning)信息。 -
error
: 這個用於致命錯誤(fatal error)信息。
2. 信息路由
通過 Yii::log 或 Yii::trace 記錄的信息是保存在內存中的。 我們通常需要將它們顯示到瀏覽器窗口中,或者將他們保存到一些 持久存儲例如文件、Email中。這個就叫作 信息路由,例如, 發送信息到不同的目的地。
在 Yii 中,信息路由是由一個叫做 CLogRouter 的應用組件管理的。 它負責管理一系列稱作 日志路由 的東西。每個日志路由 代表一個單獨的日志目的地。通過一個日志路由發送的信息會被他們的級別和分類過濾。
要使用信息路由,我們需要安裝並預加載一個 CLogRouter 應用組件。我們也還需要配置它的 routes 屬性為我們想要的那些日志路由。 下面的代碼演示了一個所需的 應用配置 示例:
array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'trace, info', 'categories'=>'system.*', ), array( 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'admin@example.com', ), ), ), ), )
在上面的例子中,我們定義了兩個日志路由。第一個是 CFileLogRoute ,它會把信息保存在位於應用程序 runtime 目錄中的一個文件中。 而且只有級別為 trace
或 info
、分類以 system.
開頭的信息才會被保存。 第二個路由是 CEmailLogRoute ,它會將信息發送到指定的 email 地址,且只有級別為 error
或 warning
的才會發送。
在 Yii 中,有下列幾種日志路由可用:
- CDbLogRoute: 將信息保存到數據庫的表中。
- CEmailLogRoute: 發送信息到指定的 Email 地址。
- CFileLogRoute: 保存信息到應用程序 runtime 目錄中的一個文件中。
- CWebLogRoute: 將 信息 顯示在當前頁面的底部。
- CProfileLogRoute: 在頁面的底部顯示概述(profiling)信息。
3. 信息過濾
正如我們所提到的,信息可以在他們被發送到一個日志路由之前通過它們的級別和分類過濾。 這是通過設置對應日志路由的 levels 和 categories 屬性完成的。 多個級別或分類應使用逗號連接。
由於信息分類是類似 xxx.yyy.zzz
格式的,我們可以將其視為一個分類層級。 具體地,我們說 xxx
是 xxx.yyy
的父級,而xxx.yyy
又是 xxx.yyy.zzz
的父級。 這樣我們就可以使用 xxx.*
表示分類 xxx
及其所有的子級和孫級分類。
public function actionTest()
{
Yii::log("this is a info log",'info','userlog');
}
array(
'class'=>'CFileLogRoute',
'levels'=>'trace,info',
'categories'=>'userlog',
'logFile'=>'log.txt',
),
運行時在runtime目錄下生產log.txt文件:內容為:
2014/03/31 21:49:23 [info] [userlog] this is a info log
in F:\xampp\htdocs\php\yiiblog2\protected\controllers\LogController.php (6)
in F:\xampp\htdocs\php\yiiblog2\index.php (14)
可以配置那里增加一個'runtimePath' => 目錄/'tmp/',
日志文件就會放在這里了。
array(
'class' =>'CFileLogRoute',
'levels'=>CLogger::LEVEL_ERROR,
'logFile'=>'error.txt',
'maxFileSize' => '1024',
),
錯誤會輸出到error。txt文件里。
一篇文章:
一直對Yii文件日志的配置沒有關注,基本上都是默認配置,最近發現所有日志都寫在一個文件里,並且日志文件都保存在Yii項目的runtime目錄下,查看非常不方便,於是想將不同類型的日志進行拆分,並且單獨放入空間較大的數據盤,稍微看了一下Yii的文件日志類,測試了一下相關配置,覺得配置還挺方便的,記錄下來:
在main.php文件中,配置日志的地方
配置: 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning, info', 'categories'=> 'application.*',//日志文件分類,只有調用時使用了appplication都會默認寫入默認文件application.log 'logPath'=>'/mnt/php/logs', //日志文件路徑 要用絕對路徑, 'maxFileSize'=>5120,//日志大小 'maxLogFiles'=>20,//保存最大個數,Yii會按時間保留最近20個文件 ), array( 'class' => 'CFileLogRoute', 'levels' => 'error, warning,info', 'categories'=> 'db.*',//日志文件分類,db相關 'logFile'=> 'db.log',//保存數據庫操作相關日志 'logPath'=>'/mnt/php/logs', //日志文件路徑 'maxFileSize'=>5120,//日志大小5M,以kb為單位的 'maxLogFiles'=>20, ), array( 'class' => 'CFileLogRoute', 'levels' => 'trace', 'categories'=> 'debug.*', 'logFile'=> 'debug.log',//保存debug日志 'logPath'=>'/mnt/php/logs', 'maxFileSize'=>5120, 'maxLogFiles'=>20, ), ) ), 調用: //默認寫入application.log Yii::log($content,CLogger::LEVEL_INFO); //將$content寫入/mnt/php/logs/debug.log,級別為trace Yii::log($content,CLogger::LEVEL_TRACE,'debug'); //以下三種寫法都會將$content寫入/mnt/php/logs/db.log,並且在每行日志前面會使用db.model1, //db.model2,db.model3區分,級別均為error Yii::log($content,CLogger::LEVEL_ERROR,'db.model1'); Yii::log($content,CLogger::LEVEL_ERROR,'db.model2'); Yii::log($content,CLogger::LEVEL_ERROR,'db.model3'); 源碼:framework/logging/CFileLogRoute.php /** * @var integer maximum log file size */ private $_maxFileSize=1024; // in KB /** * @var integer number of log files used for rotation */ private $_maxLogFiles=5; /** * @var string directory storing log files */ private $_logPath; /** * @var string log file name */ private $_logFile='application.log'; 這幾個參數都提供了get和set方法,所以可以在配置里面配置即可 另外一些參數可以參考父類:framework/logging/CLogRoute.php /** * @var string list of levels separated by comma or space. Defaults to empty, meaning all levels. */ public $levels=''; /** * @var mixed array of categories, or string list separated by comma or space. * Defaults to empty array, meaning all categories. */ public $categories=array(); 應該還有一些可以配置,暫時無用到,沒做深入研究了
輸出包含幾個屬性:時間 [日志級別] [日志的分類] 日志內容.
參考:http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.logging
更多:http://ljzxzxl.com/201309/website/php-678.html
Yii2日志:
http://www.cnblogs.com/rhythmK/p/4479246.html