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 获取客户端真实IP地址多种方法小结
May 15 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
Php-Redis安装测试笔记
Mar 05 PHP
php实现的验证码文件类实例
Jun 18 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
Aug 28 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
php 操作符与控制结构
2012/03/07 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python使用Apriori算法进行关联性解析
2017/12/21 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Python实现图像的垂直投影示例
2020/01/17 Python
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
集团薪酬管理制度
2014/01/13 职场文书
店面出租协议书范本
2014/11/28 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS