PDA

View Full Version : تغییر در سیستم log در Yii



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 اصولی هستش یا نه؟

با تشکر

MMSHFE
چهارشنبه 17 اردیبهشت 1393, 12:47 عصر
یک راهش اینه که توی بازنویسی، ()parent::log رو اول صدا بزنید و بعد عملیات دلخواه خودتون رو هم انجام بدین. راه دیگه هم اینه که کد متد log رو از کلاس اصلی کپی کنید توی کلاس خودتون و تغییرات رو اعمال کنید. این کلاس رو هم توی پوشه components بگذارین (این یک کامپوننته نه اکستنشن).

qartalonline
چهارشنبه 17 اردیبهشت 1393, 18:06 عصر
ممنون. آقای شهرکی.
تو بازنویسی به مشکل برخوردم. ظاهرا باید کل سیستم لاگ رو تغییر بدم.
تصمیم گرفتم اگه model خطا داشت از طریق متغییر سراسری یا توسط یکی از متغییرهای $_POST یا $_GET ارسال کنم.