包 | system.logging |
---|---|
继承 | class CDbLogRoute » CLogRoute » CComponent |
源自 | 1.0 |
版本 | $Id: CDbLogRoute.php 3069 2011-03-14 00:28:38Z qiang.xue $ |
源码 |
CDbLogRoute存储日志信息到数据库表中。
指定数据库表存在日志信息,设置logTableName为表名, 并且指定connectionID为一个CDbConnection的应用程序组件的ID 。 如果他们没有设置,一个名为‘log-YiiVersion.db’的SQLite3数据库将被创建,并且在应用程序运行时目录下使用。 CCDbLogRoute存储日志信息到数据库表中。
指定数据库表存在日志信息,设置logTableName为表名, 并且指定connectionID为一个CDbConnection的应用程序组件的ID 。 如果他们没有设置,一个名为‘log-YiiVersion.db’的SQLite3数据库将被创建,并且在应用程序运行时目录下使用。 CCDbLogRoute存储日志信息到数据库表中。
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
autoCreateLogTable | boolean | 是否日志数据库表不存在时自动创建。默认为true。 | CDbLogRoute |
categories | string | 被逗号或空格分隔的类别列表。默认为空,意味着所有类别。 | CLogRoute |
connectionID | string | 应用程序组件CDbConnection的ID。
如果没有设置, 一个SQLite数据将被自动创建和使用。
此SQLite数据库文件是 protected/runtime/log-YiiVersion.
|
CDbLogRoute |
enabled | boolean | 是否启用这个日志路由。默认为true。 | CLogRoute |
filter | mixed | 附加过滤器 (例如 CLogFilter) 它被应用到日志信息。
这个属性的值被传递到 Yii::createComponent 创建一个日志过滤器对象。
结果,这可能是一个表示过滤器类名的字符串或一个表示过滤器配置的数组。
总之,日志过滤器类应该是 CLogFilter 或它的一个子类。 默认为null,意味着没有过滤器被使用。 |
CLogRoute |
levels | string | 用逗号或空格分隔的等级列表。默认是空,意味着所有等级。 | CLogRoute |
logTableName | string | 存储日志信息的数据库表名。默认是‘YiiLog’。
如果autoCreateLogTable是false,你想自己手动创建数据表,
你需要确保数据表是下面的结构:
( id INTEGER NOT NULL PRIMARY KEY, level VARCHAR(128), category VARCHAR(128), logtime INTEGER, message TEXT )注意,‘id’列必须作为auto-incremental列。 在MySQL中,这意味你应该 id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY ;
在PostgreSQL,你需要id SERIAL PRIMARY KEY 。 |
CDbLogRoute |
logs | array | 到目前为止这个日志路由搜集的日志。 | CLogRoute |
受保护属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
dbConnection | CDbConnection | 数据库连接实例 | CDbLogRoute |
公共方法
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
createLogTable() | 创建数据库表为存储日志信息。 | CDbLogRoute |
formatLogMessage() | 格式化一条日志信息已给定不同字段。 | CLogRoute |
getDbConnection() | 返回数据库连接实例 | CDbLogRoute |
processLogs() | 存储日志信息到数据库。 | CDbLogRoute |
属性详细
autoCreateLogTable
属性
public boolean $autoCreateLogTable;
是否日志数据库表不存在时自动创建。默认为true。
参见
connectionID
属性
public string $connectionID;
应用程序组件CDbConnection的ID。
如果没有设置, 一个SQLite数据将被自动创建和使用。
此SQLite数据库文件是 protected/runtime/log-YiiVersion.db
。
dbConnection
属性
只读
protected CDbConnection getDbConnection()
数据库连接实例
logTableName
属性
public string $logTableName;
存储日志信息的数据库表名。默认是‘YiiLog’。 如果autoCreateLogTable是false,你想自己手动创建数据表, 你需要确保数据表是下面的结构:
( id INTEGER NOT NULL PRIMARY KEY, level VARCHAR(128), category VARCHAR(128), logtime INTEGER, message TEXT )注意,‘id’列必须作为auto-incremental列。 在MySQL中,这意味你应该
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
;
在PostgreSQL,你需要id SERIAL PRIMARY KEY
。
方法详细
createLogTable()
方法
protected void createLogTable(CDbConnection $db, string $tableName)
| ||
$db | CDbConnection | 数据库连接 |
$tableName | string | 要创建的表名称 |
protected function createLogTable($db,$tableName)
{
$driver=$db->getDriverName();
if($driver==='mysql')
$logID='id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY';
else if($driver==='pgsql')
$logID='id SERIAL PRIMARY KEY';
else
$logID='id INTEGER NOT NULL PRIMARY KEY';
$sql="
CREATE TABLE $tableName
(
$logID,
level VARCHAR(128),
category VARCHAR(128),
logtime INTEGER,
message TEXT
)";
$db->createCommand($sql)->execute();
}
创建数据库表为存储日志信息。
getDbConnection()
方法
protected CDbConnection getDbConnection()
| ||
{return} | CDbConnection | 数据库连接实例 |
protected function getDbConnection()
{
if($this->_db!==null)
return $this->_db;
else if(($id=$this->connectionID)!==null)
{
if(($this->_db=Yii::app()->getComponent($id)) instanceof CDbConnection)
return $this->_db;
else
throw new CException(Yii::t('yii','CDbLogRoute.connectionID "{id}" does not point to a valid CDbConnection application component.',
array('{id}'=>$id)));
}
else
{
$dbFile=Yii::app()->getRuntimePath().DIRECTORY_SEPARATOR.'log-'.Yii::getVersion().'.db';
return $this->_db=new CDbConnection('sqlite:'.$dbFile);
}
}
init()
方法
public void init()
|
public function init()
{
parent::init();
if($this->autoCreateLogTable)
{
$db=$this->getDbConnection();
$sql="DELETE FROM {$this->logTableName} WHERE 0=1";
try
{
$db->createCommand($sql)->execute();
}
catch(Exception $e)
{
$this->createLogTable($db,$this->logTableName);
}
}
}
初始化此路由。 这个方法在路由管理器创建此路由后发起。
processLogs()
方法
protected void processLogs(array $logs)
| ||
$logs | array | 日志信息列表 |
protected function processLogs($logs)
{
$sql="
INSERT INTO {$this->logTableName}
(level, category, logtime, message) VALUES
(:level, :category, :logtime, :message)
";
$command=$this->getDbConnection()->createCommand($sql);
foreach($logs as $log)
{
$command->bindValue(':level',$log[1]);
$command->bindValue(':category',$log[2]);
$command->bindValue(':logtime',(int)$log[3]);
$command->bindValue(':message',$log[0]);
$command->execute();
}
}
存储日志信息到数据库。