CDbLogRoute


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存储日志信息到数据库表中。

公共属性

属性 类型 描述 定义在
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

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
collectLogs() 从日志记录器取回已过滤的日志信息以便进一步处理。 CLogRoute
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化此路由。 CDbLogRoute
raiseEvent() 发起一个事件。 CComponent

受保护方法

方法 描述 定义在
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 属性 只读

数据库连接实例

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();
    }
}

存储日志信息到数据库。