zoukankan      html  css  js  c++  java
  • YII2中日志的配置与使用

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

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

    return [
    	//log必须在bootstrap期间就被加载,便于及时调度日志消息到目标
    	'bootstrap' => ['log'],
    
    	'components' => [
    		'log' => [
    			//消息跟踪级别,设置yiilogDispatcher::traceLevel属性
    			//YII_DEBUG开启时,日志消息被记录时,追加最多3个调用堆栈信息
    			'traceLevel' => YII_DEBUG ? 3 : 0,
    			//日志目标,可定义多个
    			'targets' => [
    				[
    					//日志处理器类
    					'class' => 'yiilogFileTarget',
    					//日志记录的级别
    					'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' => 'yiilogDbTarget',
    			//日志记录的级别
    			'levels' => ['error', 'warning'],
    			//追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
    			'logVars' => [],
    			//定义分类
    			'categories' => ['db'],
    		],
    		[
    			//日志处理器类,这里我改用数据库存日志了
    			'class' => 'yiilogDbTarget',
    			//日志记录的级别
    			'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' => 'yiilogFileTarget',
    			'levels' => ['error', 'warning'],
    		],
    		[
    			//日志处理器类,这里我改用数据库存日志了
    			'class' => 'yiilogDbTarget',
    			//日志记录的级别,这里演示设为info
    			'levels' => ['info'],
    			//定义分类
    			'categories' => ['yiidb*'],
    		],
    	],
    ],
    

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

    <?php
    
    namespace appcontrollers;
    
    use YII;
    use yiidbQuery;
    use yiiwebController;
    
    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' => 'yiilogFileTarget',
    			'levels' => ['error', 'warning'],
    		],
    		[
    			//日志处理器类,这里我改用数据库存日志了
    			'class' => 'yiilogDbTarget',
    			'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' => 'yiilogFileTarget',
    			'levels' => ['error', 'warning'],
    		],
    		[
    			//日志处理器类,这里我改用数据库存日志了
    			'class' => 'yiilogDbTarget',
    			//当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出
    			//通过exportInterval来设置这个导出数量
    			'exportInterval' => 100,
    			'levels' => ['error', 'warning'],
    			//定义分类
    			'categories' => ['db'],
    		],
    	],
    ],
    

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

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

    'log' => [
    	'traceLevel' => YII_DEBUG ? 3 : 0,
    	'flushInterval' => 1,
    	'targets' => [
    		[
    			'class' => 'yiilogFileTarget',
    			'levels' => ['error', 'warning'],
    		],
    		[
    			'class' => 'yiilogFileTarget',
    			'exportInterval' => 1,
    			'levels' => ['error', 'warning'],
    			//定义分类
    			'categories' => ['db'],
    		],
    	],
    ],

    将flushInterval和exportInterval分别设为1。

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

    'log' => [
    	'traceLevel' => YII_DEBUG ? 3 : 0,
    	'targets' => [
    		'pay' => [
    			'class' => 'yiilogDbTarget',
    			'levels' => ['error', 'warning'],
    			'categories' => ['pay'],
    		],
    		'db' => [
    			'class' => 'yiilogDbTarget',
    			'levels' => ['error', 'warning'],
    			'categories' => ['db'],
    		],
    	],
    ],
    

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

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

      

  • 相关阅读:
    【架构】如何设计支持多租户的数据库?
    maven的仓库:本地和远程
    maven私服
    MSA(微服务简介)
    json数据的格式
    shiro的原理理解
    异构的概念?大数据量的异构处理?
    面试之多线程通信
    面试之并发的解决方案
    进程与线程的简单理解
  • 原文地址:https://www.cnblogs.com/jkko123/p/8692376.html
Copyright © 2011-2022 走看看