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


Posted in PHP onMarch 18, 2020

本文实例讲述了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('我是一条错误');

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

注意我们上面定义日志的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

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

当然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);
  }
}

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

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

'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');

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

由于没有登陆和分模块,所以没获取到用户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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP对字符串的递增运算分析
Aug 08 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
php中关于socket的系列函数总结
May 18 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
php实现将数据做成json的格式给前端使用
Aug 21 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 #PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 #PHP
Laravel框架下的Contracts契约详解
Mar 17 #PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 #PHP
PHP代码加密的方法总结
Mar 13 #PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 #PHP
YII2框架中actions的作用与使用方法示例
Mar 13 #PHP
You might like
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
js实现随机8位验证码
2020/07/24 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
JS实现手写 forEach算法示例
2020/04/29 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
银行求职推荐信范文
2013/11/30 职场文书
村官工作鉴定评语
2014/01/27 职场文书
酒店管理求职信范文
2014/04/06 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
大专护理专业自荐信
2015/03/25 职场文书
煤矿施工安全协议书
2016/03/22 职场文书