qartalonline
چهارشنبه 17 اردیبهشت 1393, 12:38 عصر
سلام
من قصد دارم در هنگام تهیه log به غیر از message، category،level و time مقادیر دیگری مثل error های تولید شده در model و مقادیر $_POST ، $_GET ، $_SERVER و ID کاربر لاگین شده رو در دیتابیس ذخیره کنم.
برای همین extension به نام DbLogRoute نوشتم و برخی از متدهای کلاس CDbLogRoute بصورت زیر بازنویسی کردم:
<?php
class DbLogRoute extends CDbLogRoute
{
/**
* 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',
'user_id' => 'int(11) DEFAULT NULL',
'level' => 'VARCHAR(128) NOT NULL',
'category' => 'VARCHAR(128) NOT NULL',
'message' => 'VARCHAR(255) DEFAULT NULL',
'input_post' => 'text DEFAULT NULL',
'input_get' => 'text DEFAULT NULL',
'time' => 'VARCHAR(80) NOT NULL',
'agent' => 'text NOT NULL',
'KEY `user_id` (`user_id`)',
'KEY `level` (`level`)',
'KEY `category` (`category`)',
'KEY `time` (`time`)',
),
'ENGINE=InnoDB CHARSET=utf8'
);
// foreign key relationships
// the {{log}}.user_id is a refrence to {{user}}.id
$db->createCommand()->addForeignKey('fk_log_user_id', '{{log}}', 'user_id', '{{user}}', 'id', 'RESTRICT', 'RESTRICT');
}
/**
* Stores log messages into database.
* @param array $logs list of log messages
*/
protected function processLogs($logs)
{
$userId = (Yii::app()->user !== null ? Yii::app()->user->id : 0);
$command = $this->getDbConnection()->createCommand();
foreach ($logs as $log)
{
$command->insert($this->logTableName, array(
'user_id' => $userId,
'level' => $log[1],
'category' => $log[2],
'time' => (int)$log[3],
'message' => $log[0],
'input_post' => base64_encode(serialize($_POST)),
'input_get' => base64_encode(serialize($_GET)),
'agent' => base64_encode(serialize($_SERVER)),
));
}
}
}
حالا مشکلم اینجاست که فقط با این روش ظاهرا نمیتونم $model->errors رو ذخیره کنم.
سوالم این بود که بهترین روش برای این کار که performance رو پایین نیاره چیست. چیزی که به ذهن خودم میرسه اینه که متد Yii::log() رو بازنویسی کنم و توسط اون بتونم $model->errors رو بصورت یکی از پارامتر هاش ارسال کنم. و دقیق نمیدونم که چطوری بازنویسی کنم که مشکلی پیش نیاد و log ها رو بعد از تموم شدن اسکریپت ذخیره کنه.
سوال دیگه اینکه اصلا این روش بازنویسی کلاس CDbLogRoute و متد log اصولی هستش یا نه؟
با تشکر
من قصد دارم در هنگام تهیه log به غیر از message، category،level و time مقادیر دیگری مثل error های تولید شده در model و مقادیر $_POST ، $_GET ، $_SERVER و ID کاربر لاگین شده رو در دیتابیس ذخیره کنم.
برای همین extension به نام DbLogRoute نوشتم و برخی از متدهای کلاس CDbLogRoute بصورت زیر بازنویسی کردم:
<?php
class DbLogRoute extends CDbLogRoute
{
/**
* 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',
'user_id' => 'int(11) DEFAULT NULL',
'level' => 'VARCHAR(128) NOT NULL',
'category' => 'VARCHAR(128) NOT NULL',
'message' => 'VARCHAR(255) DEFAULT NULL',
'input_post' => 'text DEFAULT NULL',
'input_get' => 'text DEFAULT NULL',
'time' => 'VARCHAR(80) NOT NULL',
'agent' => 'text NOT NULL',
'KEY `user_id` (`user_id`)',
'KEY `level` (`level`)',
'KEY `category` (`category`)',
'KEY `time` (`time`)',
),
'ENGINE=InnoDB CHARSET=utf8'
);
// foreign key relationships
// the {{log}}.user_id is a refrence to {{user}}.id
$db->createCommand()->addForeignKey('fk_log_user_id', '{{log}}', 'user_id', '{{user}}', 'id', 'RESTRICT', 'RESTRICT');
}
/**
* Stores log messages into database.
* @param array $logs list of log messages
*/
protected function processLogs($logs)
{
$userId = (Yii::app()->user !== null ? Yii::app()->user->id : 0);
$command = $this->getDbConnection()->createCommand();
foreach ($logs as $log)
{
$command->insert($this->logTableName, array(
'user_id' => $userId,
'level' => $log[1],
'category' => $log[2],
'time' => (int)$log[3],
'message' => $log[0],
'input_post' => base64_encode(serialize($_POST)),
'input_get' => base64_encode(serialize($_GET)),
'agent' => base64_encode(serialize($_SERVER)),
));
}
}
}
حالا مشکلم اینجاست که فقط با این روش ظاهرا نمیتونم $model->errors رو ذخیره کنم.
سوالم این بود که بهترین روش برای این کار که performance رو پایین نیاره چیست. چیزی که به ذهن خودم میرسه اینه که متد Yii::log() رو بازنویسی کنم و توسط اون بتونم $model->errors رو بصورت یکی از پارامتر هاش ارسال کنم. و دقیق نمیدونم که چطوری بازنویسی کنم که مشکلی پیش نیاد و log ها رو بعد از تموم شدن اسکریپت ذخیره کنه.
سوال دیگه اینکه اصلا این روش بازنویسی کلاس CDbLogRoute و متد log اصولی هستش یا نه؟
با تشکر