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解析html的实现代码
Aug 08 PHP
php实现文件下载更能介绍
Nov 23 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
PHP实现的增强性mhash函数
May 27 PHP
帝国cms常用标签汇总
Jul 06 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
PDO::lastInsertId讲解
Jan 29 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
python格式化字符串实例总结
2014/09/28 Python
Python入门之modf()方法的使用
2015/05/15 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
学校经典推荐信
2013/10/30 职场文书
室内拓展活动方案
2014/02/13 职场文书
绿色环保标语
2014/06/12 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
MySQL sql_mode的使用详解
2021/05/08 MySQL
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫