Logging یا ثبت وقایع در فریمورک Yii
Yii یک فریمورک قابل تنظیم و قابل انعطاف می باشد. با استفاده از این فریمورک، می توانید براحتی انواع مختلفی از پیام های لاگ یا log message ها را ثبت کنید.
برای ثبت یک log message، باید یکی از متدهای زیر را فراخوانی کنید:
- Yii::error() - پیغام های fatal error را ثبت می کند.
- Yii::warning()- پیغام های warning را ثبت می کند.
- Yii::info() - پیغام های همراه با برخی اطلاعات مفید را ثبت می کند.
- Yii::trace() - پیغام های trace را ثبت می کند.این پیغام ها از نحوه ی اجرا یک تکه کد، ایجاد می شوند.
متد های فوق، log messageها را در دسته های مختلفی ثبت می کنند. آنها برای این کار، اینگونه از تابع استفاده می کنند:
function ($message, $category = 'application')
- $message – در این متغیر، log message ذخیره می شود.
- $category - در این متغیر، دسته ی log message ذخیره می شود.
یک روش ساده و راحت برای نامگذاری scheme، استفاده از ثابت جادویی __METHOD__ است. به عنوان مثال :
Yii::info('this is a log message', __METHOD__);
یک log target یک نمونه از کلاس yii\log\Target می باشد، که همه log messageها را براساس دسته ها فیلتر می کند و آنها را به یک فایل، پایگاه داده و یا ایمیل منتقل می کند.
مرحله 1 - شما می توانید چندین log targetرا ثبت کنید. به مثال زیر دقت کنید:
return [
// the "log" component is loaded during bootstrapping time
'bootstrap' => ['log'],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning', 'trace', 'info'],
],
[
'class' => 'yii\log\EmailTarget',
'levels' => ['error', 'warning'],
'categories' => ['yii\db\*'],
'message' => [
'from' => ['log@mydomain.com'],
'to' => ['admin@mydomain.com', 'developer@mydomain.com'],
'subject' => 'Application errors at mydomain.com',
],
],
],
],
],
];
در کد بالا، دو target ثبت شده است. target اول، تمام errorها، warningها، trace ها و info message ها را انتخاب می کند و آنها را در یک پایگاه داده ذخیره می کند. target دوم، تمام errorها و warningها را به ایمیلِ admin ارسال می کند.
فریمورک Yii، از log targetهای درونی یا built-in زیر پشتیبانی می کند:
- yii\log\DbTarget – این مورد log messageها را در یک پایگاه داده ذخیره می کند.
- yii\log\FileTarget - این مورد log messageها را در فایل ذخیره می کند.
- yii\log\EmailTarget - این مورد log messageها را به آدرس های ایمیل از پیش تعریف شده ارسال می کند.
- yii\log\SyslogTarget - این مورد log messageها را در syslog با فراخوانی تابع پی اچ پی syslog() ذخیره می کند.
به طور پیش فرض، قالب و فرمت log messageها به صورت زیر می باشند:
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
مرحله 2 - برای سفارشی کردن این فرمت، بایدpropety با نام yii\log\Target::$prefix را پیکربندی کنید. برای مثال:
[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
$user = Yii::$app->has('user', true) ? Yii::$app->get('user') :
'undefined user';
$userID = $user ? $user->getId(false) : 'anonym';
return "[$userID]";
}
]
قطعه کد بالا یک log target تنظیم می کند. بطوریکه ID کاربر جاری به عنوان پیشوند، برای همه log messageها لحاظ شود.
به طور پیش فرض، log messageها، مقادیر را از متغیرهای global زیر می گیرند:
- $_GET
- $_POST
- $_SESSION
- $_COOKIE
- $_FILES
- $_SERVER
برای تغییر این روند، شما باید property با نام yii\log\Target::$logVars را با نام متغیرهایی که قصد دارید اضافه شوند، تنظیم کنید.
تمام log messageها توسط شیء logger در یک آرایه نگهداری می شوند. وقتی که آرایه از یک تعداد مشخصی از پیام ها بیشتر شود، شی logger پیام های ضبط شده برای log target ها را، حذف می کند (عدد پیش فرض 1000 است).
مرحله 3 - برای دستکاری این عدد، شما باید property با نام flushInterval فراخوانی کنید.
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 50, // default is 1000
'targets' => [...],
],
],
];
مرحله 5 - حال فایل config/web.php را اینگونه تغییر دهید.
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'flushInterval' => 1,
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'logVars' => []
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
در کد بالا، ما کامپوننت log را تعریف نمودیم، propertyهای flushInterval و exportInteval را با مقدار 1 تنظیم کردیم، بنابراین بلافاصله همه log messageها در فایل های log نمایش داده می شوند. همچنین ما پروپرتی levels را حذف نمودیم. این بدین معنی است که log messageهای تمام دسته ها (error, warning, info, trace) در فایل های log نمایش داده می شود نه log message های دسته ی خاصی.
مرحله 6 - سپس یک تابع به نام actionLog() در SiteController ایجاد کنید.
public function actionLog() {
Yii::trace('trace log message');
Yii::info('info log message');
Yii::warning('warning log message');
Yii::error('error log message');
}
در کد بالا، ما از هر دسته ای، چهار log message به فایل های log اضافه نمودیم.
مرحله 7 – در نوار آدرسبار مرورگر وب تان آدرس http://localhost:8080/index.php?r=site/log را تایپ کنید. Log messageها باید در دایرکتوری app/runtime/logs در فایل app.log ظاهر شوند.
این فصل در یک نگاه:
…
سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…این فصل در یک نگاه:
…
پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…