牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii将需要的log写入到数据库中

创建时间:2014-09-10 投稿人: 浏览次数:1231

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");
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。