Yii將需要的log寫入到資料庫中

akbarken發表於2014-09-10

Base版本:

一,配置環境(main.php)

'log' => array(
   'class' => 'CLogRouter',
   'routes' => array(
         //寫入檔案的log,預設categories為application
         array(
              'class' => 'CFileLogRoute',
              'levels' => 'info, warning, error, profile, debug',
          ),
         //寫入資料庫的log,categories為mail,web
         array(
              'class'=>'CDbLogRoute',
              'connectionID'=>'db',
              'levels'=>'info, warning, error, profile, debug',
              'logTableName' => 'userlogs',
              'categories'=>'mail,web', //可以隨便定義
          ),
    ),
)
二,建立資料庫
CREATE TABLE `userlogs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `level` VARCHAR(128) NULL DEFAULT NULL, 
    `category` VARCHAR(128) NULL DEFAULT NULL, 
    `logtime` INT(11) UNSIGNED NULL DEFAULT NULL,
    `message` TEXT NULL,  
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//解析一下,資料庫的欄位為什麼是這些,可以看YII原始碼中的CDbLogRoute.php檔案(/framework/logging下)
//這個檔案中table欄位就包括這些,我們用Yii::log($message,$level,$category)的時候就會自動的將欄位
//插入到相應的欄位;
 
三,插入log
在你想執行的地方,加入如下程式碼,就可將log寫入到資料庫中
Yii::log('log message內容','info','mail');

 

================================================================================

擴充套件版:

擴充套件,如果我們需要儲存更多的資訊?:

比如,我需要將使用者的ip也存入到資料庫中,那麼該怎樣呢?

很簡單:
一,首先寫一個類,繼承CLogRoute(我們發現CDbLogRoute也是繼承CLogRoute)
簡單做法:複製一份CDbLogRoute,將其改名為我們想要的名字,例如MyCDbLogRoute
這樣MyCDbLogRoute內容就和CDbLogRoute一樣了.
 
二,修改MyCDbLogRoute方法createLogTable
原方法:
protected function createLogTable($db,$tableName)
 {
  $db->createCommand()->createTable($tableName, array(
   'id'=>'pk',
   'level'=>'varchar(128)',
   'category'=>'varchar(128)',
   'logtime'=>'integer',
   'message'=>'text',
  ));
 }
修改成:
protected function createLogTable($db,$tableName)
 {
  $db->createCommand()->createTable($tableName, array(
   'id'=>'pk',
   'level'=>'varchar(128)',
   'category'=>'varchar(128)',
   'logtime'=>'integer',
   'message'=>'text',
   'ip'=>'text',
  ));
 }
 
三,修改方法processLogs
原方法:
protected function processLogs($logs)
 {
  $command=$this->getDbConnection()->createCommand();
  foreach($logs as $log)
  {
   $command->insert($this->logTableName,array(
    'level'=>$log[1],
    'category'=>$log[2],
    'logtime'=>(int)$log[3],
    'message'=>$log[0],
   ));
  }
 }
修改成:
protected function processLogs($logs)
 {
  $command=$this->getDbConnection()->createCommand();
  foreach($logs as $log)
  {
   $command->insert($this->logTableName,array(
    'level'=>$log[1],
    'category'=>$log[2],
    'logtime'=>(int)$log[3],
    'message'=>$log[0],
    'ip'=>Yii::app()->request->userHostAddress,//獲取使用者ip
   ));
  }
 }
 
四,建立一個table
CREATE TABLE `userlogs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`level` VARCHAR(128) NULL DEFAULT NULL,
`category` VARCHAR(128) NULL DEFAULT NULL,
`logtime` INT(11) UNSIGNED NULL DEFAULT NULL,
`message` TEXT NULL,
`ip` TEXT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
五,修改main.php
將我們建立的MyCDbLogRoute拷貝到protected/components下,
同時修改main.php中的'class'=>'CDbLogRoute'=》'class'=>'MyCDbLogRoute'
 
六,記錄log
在你想執行的地方,加入如下程式碼,就可將log寫入到資料庫中
Yii::log('log message內容','info','mail');

相關文章