YII2框架中日志的配置与使用方法实例分析
发布:smiling 来源: PHP粉丝网 添加日期:2022-02-21 09:25:24 浏览: 评论:0
本文实例讲述了YII2框架中日志的配置与使用方法,分享给大家供大家参考,具体如下:
YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用。
我们在config/web.php中配置如下:
- return [
 - //log必须在bootstrap期间就被加载,便于及时调度日志消息到目标
 - 'bootstrap' => ['log'],
 - 'components' => [
 - 'log' => [
 - //消息跟踪级别,设置yii\log\Dispatcher::traceLevel属性
 - //YII_DEBUG开启时,日志消息被记录时,追加最多3个调用堆栈信息
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - //日志目标,可定义多个
 - 'targets' => [
 - [
 - //日志处理器类
 - 'class' => 'yii\log\FileTarget',
 - //日志记录的级别
 - 'levels' => ['error', 'warning'],
 - //定义日志文件
 - 'logFile' => '@runtime/logs/test.log',
 - ],
 - ],
 - ],
 - ],
 - ];
 
通过下面5个方法,来写入我们自已的日志
- //跟踪
 - Yii::trace('我是一条跟踪');
 - //消息
 - YII::info('我是一条消息');
 - //调试
 - YII::debug('我是一条调试');
 - //警告
 - YII::warning('我是一条警告');
 - //错误
 - YII::error('我是一条错误');
 

注意我们上面定义日志的levels为['error', 'warning'],所以日志只会记录这两个级别的信息。
有些时候我们并不希望把所有日志写在一起,我们会根据不同模块来写日志,这样以便区分,这就需要用到日志的分类了。
重新配置config/web.php如下:
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - 'targets' => [
 - [
 - //日志处理器类,这里我改用数据库存日志了
 - 'class' => 'yii\log\DbTarget',
 - //日志记录的级别
 - 'levels' => ['error', 'warning'],
 - //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
 - 'logVars' => [],
 - //定义分类
 - 'categories' => ['db'],
 - ],
 - [
 - //日志处理器类,这里我改用数据库存日志了
 - 'class' => 'yii\log\DbTarget',
 - //日志记录的级别
 - 'levels' => ['error', 'warning'],
 - //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
 - 'logVars' => [],
 - //定义分类
 - 'categories' => ['pay'],
 - ],
 - ],
 - ],
 
通过如下方法,添加我们的日志
- //警告
 - YII::warning('我是一条数据库警告', 'db');
 - //错误
 - YII::error('我是一条数据库错误', 'db');
 - //警告
 - YII::warning('我是一条支付警告', 'pay');
 - //错误
 - YII::error('我是一条支付错误', 'pay');
 
由于上面的配置我们使用了DbTarget,我们还需要添加一张日志表,用于记录我们的日志,进入项目目录。运行如下命令:
yii migrate --migrationPath=@yii/log/migrations

当然categories我们也可以指定为YII的类
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - 'targets' => [
 - [
 - 'class' => 'yii\log\FileTarget',
 - 'levels' => ['error', 'warning'],
 - ],
 - [
 - //日志处理器类,这里我改用数据库存日志了
 - 'class' => 'yii\log\DbTarget',
 - //日志记录的级别,这里演示设为info
 - 'levels' => ['info'],
 - //定义分类
 - 'categories' => ['yii\db\*'],
 - ],
 - ],
 - ],
 
然后我们操作一下数据库,看是否日志记录了。
- <?php
 - namespace app\controllers;
 - use YII;
 - use yii\db\Query;
 - use yii\web\Controller;
 - class TestController extends Controller
 - {
 - public function actionTest()
 - {
 - $data = (new Query())->from('{{%user}}')
 - ->where('id=:id', [':id' => '1'])
 - ->all();
 - var_dump($data);
 - }
 - }
 

日志消息的格式化,我们可以自定义日志的前缀。
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - 'targets' => [
 - [
 - 'class' => 'yii\log\FileTarget',
 - 'levels' => ['error', 'warning'],
 - ],
 - [
 - //日志处理器类,这里我改用数据库存日志了
 - 'class' => 'yii\log\DbTarget',
 - 'levels' => ['error', 'warning'],
 - //定义分类
 - 'categories' => ['db'],
 - //定义前缀
 - 'prefix' => function($message) {
 - $uid = !emptyempty(YII::$app->user->id) ? YII::$app->user->id : '-';
 - $mid = !emptyempty(YII::$app->module->id) ? YII::$app->module->id : '-';
 - $cid = !emptyempty(YII::$app->controller->id) ? YII::$app->controller->id : '-';
 - $aid = !emptyempty(YII::$app->controller->action->id) ? YII::$app->controller->action->id : '-';
 - return "[{$uid}][{$mid}/{$cid}/{$aid}]";
 - },
 - ],
 - ],
 - ],
 
使用如下代码,记录日志,查看效果
YII::warning('我是警告!!!', 'db');
YII::error('我是错误!!!', 'db');

由于没有登陆和分模块,所以没获取到用户ID和模块ID,不过控制器ID和方法ID都获取到了。
消息的刷新和导出
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - //消息被存放在一个数组里,积累到一定数量,才会被刷新到日志target
 - //通过flushInterval设置消息刷新到日志target的数量
 - 'flushInterval' => 100,
 - 'targets' => [
 - [
 - 'class' => 'yii\log\FileTarget',
 - 'levels' => ['error', 'warning'],
 - ],
 - [
 - //日志处理器类,这里我改用数据库存日志了
 - 'class' => 'yii\log\DbTarget',
 - //当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出
 - //通过exportInterval来设置这个导出数量
 - 'exportInterval' => 100,
 - 'levels' => ['error', 'warning'],
 - //定义分类
 - 'categories' => ['db'],
 - ],
 - ],
 - ],
 
有人会问YII2设置flushInterval和exportInterval的作用是什么,因为在一些系统中日志的操作会很频繁,如果频繁的读取文件或数据库来写日志,会造成严重的IO消耗,降低系统性能,这也是YII2的一个优化吧。
当然有些时候一些长时间在控制台运行的程序,需要立即显示日志,那么可以通过如下配置:
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - 'flushInterval' => 1,
 - 'targets' => [
 - [
 - 'class' => 'yii\log\FileTarget',
 - 'levels' => ['error', 'warning'],
 - ],
 - [
 - 'class' => 'yii\log\FileTarget',
 - 'exportInterval' => 1,
 - 'levels' => ['error', 'warning'],
 - //定义分类
 - 'categories' => ['db'],
 - ],
 - ],
 - ],
 
将flushInterval和exportInterval分别设为1。
有些时候我们需要人为的开启和关闭某些日志目标,这时就需要我们为每个日志目标设个键,以区分。
- 'log' => [
 - 'traceLevel' => YII_DEBUG ? 3 : 0,
 - 'targets' => [
 - 'pay' => [
 - 'class' => 'yii\log\DbTarget',
 - 'levels' => ['error', 'warning'],
 - 'categories' => ['pay'],
 - ],
 - 'db' => [
 - 'class' => 'yii\log\DbTarget',
 - 'levels' => ['error', 'warning'],
 - 'categories' => ['db'],
 - ],
 - ],
 - ],
 
然后通过如下,进行开启和关闭:
- //关闭
 - Yii::$app->log->targets['db']->enabled = false;
 - //开启
 - Yii::$app->log->targets['db']->enabled = true;
 
Tags: YII2日志配置
- 上一篇:YII2框架中查询生成器Query()的使用方法示例
 - 下一篇:最后一页
 
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
 - PHP新手上路(一)(7)
 - 惹恼程序员的十件事(5)
 - PHP邮件发送例子,已测试成功(5)
 - 致初学者:PHP比ASP优秀的七个理由(4)
 - PHP会被淘汰吗?(4)
 - PHP新手上路(四)(4)
 - 如何去学习PHP?(2)
 - 简单入门级php分页代码(2)
 - php中邮箱email 电话等格式的验证(2)
 
