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模拟HTTP认证
Oct 09 PHP
用PHP实现的随机广告显示代码
Jun 14 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
Oct 11 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
Python实用日期时间处理方法汇总
2015/05/09 Python
Python中的rfind()方法使用详解
2015/05/19 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
python机器学习之神经网络(三)
2017/12/20 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
pygame实现非图片按钮效果
2019/10/29 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Python wordcloud库安装方法总结
2020/12/31 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
学生宿舍管理制度
2014/01/30 职场文书
高三学生评语大全
2014/04/25 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
公务员个人考察材料
2014/12/23 职场文书
企业介绍信范文
2015/01/30 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL
Hive HQL支持2种查询语句风格
2022/06/25 数据库