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 = !empty(YII::$app->user->id) ? YII::$app->user->id : '-';
                $mid = !empty(YII::$app->module->id) ? YII::$app->module->id : '-';
                $cid = !empty(YII::$app->controller->id) ? YII::$app->controller->id : '-';
                $aid = !empty(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;
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
————————————————
版权声明:本文为CSDN博主「大鹏的世界」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/adparking/article/details/109223040

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值