* @link http://www.yiiframework.com/ * @copyright 2008-2013 Yii Software LLC * @license http://www.yiiframework.com/license/ */ /** * CDbLogRoute stores log messages in a database table. * * To specify the database table for storing log messages, set {@link logTableName} as * the name of the table and specify {@link connectionID} to be the ID of a {@link CDbConnection} * application component. If they are not set, a SQLite3 database named 'log-YiiVersion.db' will be created * and used under the application runtime directory. * * @author Qiang Xue * @package system.logging * @since 1.0 */ class CDbLogRoute extends CLogRoute { /** * @var string the ID of CDbConnection application component. If not set, a SQLite database * will be automatically created and used. The SQLite database file is * protected/runtime/log-YiiVersion.db. */ public $connectionID; /** * @var string the name of the DB table that stores log content. Defaults to 'YiiLog'. * If {@link autoCreateLogTable} is false and you want to create the DB table manually by yourself, * you need to make sure the DB table is of the following structure: *
	 *  (
	 *		id       INTEGER NOT NULL PRIMARY KEY,
	 *		level    VARCHAR(128),
	 *		category VARCHAR(128),
	 *		logtime  INTEGER,
	 *		message  TEXT
	 *   )
	 * 
* Note, the 'id' column must be created as an auto-incremental column. * In MySQL, this means it should be id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY; * In PostgreSQL, it is id SERIAL PRIMARY KEY. * @see autoCreateLogTable */ public $logTableName='YiiLog'; /** * @var boolean whether the log DB table should be automatically created if not exists. Defaults to true. * @see logTableName */ public $autoCreateLogTable=true; /** * @var CDbConnection the DB connection instance */ private $_db; /** * Initializes the route. * This method is invoked after the route is created by the route manager. */ public function init() { parent::init(); if($this->autoCreateLogTable) { $db=$this->getDbConnection(); try { $db->createCommand()->delete($this->logTableName,'0=1'); } catch(Exception $e) { $this->createLogTable($db,$this->logTableName); } } } /** * Creates the DB table for storing log messages. * @param CDbConnection $db the database connection * @param string $tableName the name of the table to be created */ protected function createLogTable($db,$tableName) { $db->createCommand()->createTable($tableName, array( 'id'=>'pk', 'level'=>'varchar(128)', 'category'=>'varchar(128)', 'logtime'=>'integer', 'message'=>'text', )); } /** * @return CDbConnection the DB connection instance * @throws CException if {@link connectionID} does not point to a valid application component. */ protected function getDbConnection() { if($this->_db!==null) return $this->_db; elseif(($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); } } /** * Stores log messages into database. * @param array $logs list of log messages */ 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], )); } } }