当前位置:首页 > CMS教程 > 其它CMS > 列表

YII2框架中日志的配置与使用方法实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-21 09:25:24 浏览: 评论:0 

本文实例讲述了YII2框架中日志的配置与使用方法,分享给大家供大家参考,具体如下:

YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用。

我们在config/web.php中配置如下:

  1. return [ 
  2.     //log必须在bootstrap期间就被加载,便于及时调度日志消息到目标 
  3.     'bootstrap' => ['log'], 
  4.  
  5.     'components' => [ 
  6.         'log' => [ 
  7.             //消息跟踪级别,设置yii\log\Dispatcher::traceLevel属性 
  8.             //YII_DEBUG开启时,日志消息被记录时,追加最多3个调用堆栈信息 
  9.             'traceLevel' => YII_DEBUG ? 3 : 0, 
  10.             //日志目标,可定义多个 
  11.             'targets' => [ 
  12.                 [ 
  13.                     //日志处理器类 
  14.                     'class' => 'yii\log\FileTarget'
  15.                     //日志记录的级别 
  16.                     'levels' => ['error''warning'], 
  17.                     //定义日志文件 
  18.                     'logFile' => '@runtime/logs/test.log'
  19.                 ], 
  20.             ], 
  21.         ], 
  22.     ], 
  23. ]; 

通过下面5个方法,来写入我们自已的日志

  1. //跟踪 
  2. Yii::trace('我是一条跟踪'); 
  3. //消息 
  4. YII::info('我是一条消息'); 
  5. //调试 
  6. YII::debug('我是一条调试'); 
  7. //警告 
  8. YII::warning('我是一条警告'); 
  9. //错误 
  10. YII::error('我是一条错误'); 

YII2框架中日志的配置与使用方法实例分析

注意我们上面定义日志的levels为['error', 'warning'],所以日志只会记录这两个级别的信息。

有些时候我们并不希望把所有日志写在一起,我们会根据不同模块来写日志,这样以便区分,这就需要用到日志的分类了。

重新配置config/web.php如下:

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     'targets' => [ 
  4.         [ 
  5.             //日志处理器类,这里我改用数据库存日志了 
  6.             'class' => 'yii\log\DbTarget'
  7.             //日志记录的级别 
  8.             'levels' => ['error''warning'], 
  9.             //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。 
  10.             'logVars' => [], 
  11.             //定义分类 
  12.             'categories' => ['db'], 
  13.         ], 
  14.         [ 
  15.             //日志处理器类,这里我改用数据库存日志了 
  16.             'class' => 'yii\log\DbTarget'
  17.             //日志记录的级别 
  18.             'levels' => ['error''warning'], 
  19.             //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。 
  20.             'logVars' => [], 
  21.             //定义分类 
  22.             'categories' => ['pay'], 
  23.         ], 
  24.     ], 
  25. ], 

通过如下方法,添加我们的日志

  1. //警告 
  2. YII::warning('我是一条数据库警告''db'); 
  3. //错误 
  4. YII::error('我是一条数据库错误''db'); 
  5.  
  6. //警告 
  7. YII::warning('我是一条支付警告''pay'); 
  8. //错误 
  9. YII::error('我是一条支付错误''pay'); 

由于上面的配置我们使用了DbTarget,我们还需要添加一张日志表,用于记录我们的日志,进入项目目录。运行如下命令:

yii migrate --migrationPath=@yii/log/migrations

YII2框架中日志的配置与使用方法实例分析

当然categories我们也可以指定为YII的类

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     'targets' => [ 
  4.         [ 
  5.             'class' => 'yii\log\FileTarget'
  6.             'levels' => ['error''warning'], 
  7.         ], 
  8.         [ 
  9.             //日志处理器类,这里我改用数据库存日志了 
  10.             'class' => 'yii\log\DbTarget'
  11.             //日志记录的级别,这里演示设为info 
  12.             'levels' => ['info'], 
  13.             //定义分类 
  14.             'categories' => ['yii\db\*'], 
  15.         ], 
  16.     ], 
  17. ], 

然后我们操作一下数据库,看是否日志记录了。

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use yii\db\Query; 
  7. use yii\web\Controller; 
  8.  
  9. class TestController extends Controller 
  10.   public function actionTest() 
  11.   { 
  12.     $data = (new Query())->from('{{%user}}'
  13.       ->where('id=:id', [':id' => '1']) 
  14.       ->all(); 
  15.  
  16.     var_dump($data); 
  17.   } 

YII2框架中日志的配置与使用方法实例分析

日志消息的格式化,我们可以自定义日志的前缀。

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     'targets' => [ 
  4.         [ 
  5.             'class' => 'yii\log\FileTarget'
  6.             'levels' => ['error''warning'], 
  7.         ], 
  8.         [ 
  9.             //日志处理器类,这里我改用数据库存日志了 
  10.             'class' => 'yii\log\DbTarget'
  11.             'levels' => ['error''warning'], 
  12.             //定义分类 
  13.             'categories' => ['db'], 
  14.             //定义前缀 
  15.             'prefix' => function($message) { 
  16.                 $uid = !emptyempty(YII::$app->user->id) ? YII::$app->user->id : '-'
  17.                 $mid = !emptyempty(YII::$app->module->id) ? YII::$app->module->id : '-'
  18.                 $cid = !emptyempty(YII::$app->controller->id) ? YII::$app->controller->id : '-'
  19.                 $aid = !emptyempty(YII::$app->controller->action->id) ? YII::$app->controller->action->id : '-'
  20.                 return "[{$uid}][{$mid}/{$cid}/{$aid}]"
  21.             }, 
  22.         ], 
  23.     ], 
  24. ], 

使用如下代码,记录日志,查看效果

YII::warning('我是警告!!!', 'db');

YII::error('我是错误!!!', 'db');

YII2框架中日志的配置与使用方法实例分析

由于没有登陆和分模块,所以没获取到用户ID和模块ID,不过控制器ID和方法ID都获取到了。

消息的刷新和导出

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     //消息被存放在一个数组里,积累到一定数量,才会被刷新到日志target 
  4.     //通过flushInterval设置消息刷新到日志target的数量 
  5.     'flushInterval' => 100, 
  6.     'targets' => [ 
  7.         [ 
  8.             'class' => 'yii\log\FileTarget'
  9.             'levels' => ['error''warning'], 
  10.         ], 
  11.         [ 
  12.             //日志处理器类,这里我改用数据库存日志了 
  13.             'class' => 'yii\log\DbTarget'
  14.             //当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出 
  15.             //通过exportInterval来设置这个导出数量 
  16.             'exportInterval' => 100, 
  17.             'levels' => ['error''warning'], 
  18.             //定义分类 
  19.             'categories' => ['db'], 
  20.         ], 
  21.     ], 
  22. ], 

有人会问YII2设置flushInterval和exportInterval的作用是什么,因为在一些系统中日志的操作会很频繁,如果频繁的读取文件或数据库来写日志,会造成严重的IO消耗,降低系统性能,这也是YII2的一个优化吧。

当然有些时候一些长时间在控制台运行的程序,需要立即显示日志,那么可以通过如下配置:

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     'flushInterval' => 1, 
  4.     'targets' => [ 
  5.         [ 
  6.             'class' => 'yii\log\FileTarget'
  7.             'levels' => ['error''warning'], 
  8.         ], 
  9.         [ 
  10.             'class' => 'yii\log\FileTarget'
  11.             'exportInterval' => 1, 
  12.             'levels' => ['error''warning'], 
  13.             //定义分类 
  14.             'categories' => ['db'], 
  15.         ], 
  16.     ], 
  17. ], 

将flushInterval和exportInterval分别设为1。

有些时候我们需要人为的开启和关闭某些日志目标,这时就需要我们为每个日志目标设个键,以区分。

  1. 'log' => [ 
  2.     'traceLevel' => YII_DEBUG ? 3 : 0, 
  3.     'targets' => [ 
  4.         'pay' => [ 
  5.             'class' => 'yii\log\DbTarget'
  6.             'levels' => ['error''warning'], 
  7.             'categories' => ['pay'], 
  8.         ], 
  9.         'db' => [ 
  10.             'class' => 'yii\log\DbTarget'
  11.             'levels' => ['error''warning'], 
  12.             'categories' => ['db'], 
  13.         ], 
  14.     ], 
  15. ], 

然后通过如下,进行开启和关闭:

  1. //关闭 
  2. Yii::$app->log->targets['db']->enabled = false; 
  3. //开启 
  4. Yii::$app->log->targets['db']->enabled = true;

Tags: YII2日志配置

分享到: