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('我是一条错误');

注意我们上面定义日志的levels为['error','warning'],所以日志只会记录这两个级别的信息。

有些时候我们并不希望把所有日志写在一起,我们会根据不同模块来写日志,这样以便区分,这就需要用到日志的分类了。

重新配置config/web.php如下:

'log' => [
	'traceLevel' => YII_DEBUG ? 3 : 0,'targets' => [
		[
			//日志处理器类,这里我改用数据库存日志了
			'class' => 'yii\log\DbTarget',//日志记录的级别
			'levels' => ['error',//追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。
			'logVars' => [],//定义分类
			'categories' => ['db'],[
			//日志处理器类,这里我改用数据库存日志了
			'class' => 'yii\log\DbTarget',//定义分类
			'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' => 'yii\log\FileTarget','levels' => ['error',//日志记录的级别,这里演示设为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);
    }
}

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

'log' => [
	'traceLevel' => YII_DEBUG ? 3 : 0,//定义前缀
			'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,//当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出
			//通过exportInterval来设置这个导出数量
			'exportInterval' => 100,

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

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

'log' => [
	'traceLevel' => YII_DEBUG ? 3 : 0,'flushInterval' => 1,[
			'class' => 'yii\log\FileTarget','exportInterval' => 1,

将flushInterval和exportInterval分别设为1。

 

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

'log' => [
	'traceLevel' => YII_DEBUG ? 3 : 0,'targets' => [
		'pay' => [
			'class' => 'yii\log\DbTarget','categories' => ['pay'],'db' => [
			'class' => 'yii\log\DbTarget','categories' => ['db'],

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

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

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、将Yii2.0advanced版中应用主体frontend或backend应用复制为api应用2、在应用主体api目录的controller新建SiteController.php:namespaceapi\controllers;useYii;useyii\rest\ActiveController;/*SiteController测试控制器*/classSiteControllerextendsActiveCon
Yii2restfulAPI文档一、配置模块:1.Config/main.php:  2.创建模块目录:  3.Module.php:  二、路由配置:  三、控制器:  四、Models:   五、测试:GET:  POST:  PUT:      DELETE:  
Yii在framework/i18n/data/%lang%.php文件中有很多翻译.这是例如germantranslations我想在我的Yii项目中使用Fullcalendar.要翻译此日历,我必须为当前语言提供一个monthNames/dayNames数组.FullcalendarmonthNamesDocumentationYii生成数组的最佳方法是什么:['January'
在Yii2中,官方的页面多语言解决方案有两个:方案1,使用Yii::t()函数,在页面中需要输出文字的地方,使用类似如下代码:<?=Yii::t(‘views/login’,‘hello’)?>这样做的后果是页面上大量充斥着类似的代码,导致页面可读性很差,而且对于同一个页面来说,Yii::t()函数的第一个参数基本上都是
Yii2.0对数据库查询的一些简单的操作123456789101112131415161718192021222324252627282930313233343536373839User::findOne($id);   //此方法返回 主键 id=1  的一条数据(举个例子);  User::find()->where(['name' =
数据查询User::find()->all();此方法返回所有数据;User::findOne($id);此方法返回主键id=1的一条数据(举个例子);User::find()->where(['name'=>'小伙儿'])->one();此方法返回['name'=>'小伙儿']的一条数据;User::find()->where(['n
最近打算提升自己的解决问题能力,于是打算从学习其他框架下手,让我们先去了解yii框架是如何运作的吧!https://www.yiichina.com/访问yii中文网站  让我们先把框架下载下来点击下载框架 科普一下:目前yii框架有三个版本yii1.0、yii1.1、yii2.0貌似即将推出3.0 这里我们
如何在Yii2中检查模型属性的类型(列类型)?ThisoldYiiForumanswer给了我一个结论,在Yii1中我可以使用类似的东西:$model->getMetaData()->columns['attribute-name']->type;但我没有成功将此解决方案移植到Yii2.有人可以帮忙吗?解决方法:您可以使用:$model->getTableSchema()
defined('YII_DEBUG')ordefine('YII_DEBUG',true);defined('YII_ENV')ordefine('YII_ENV','dev');require(__DIR__.'/../vendor/autoload.php');//注册类加载器require(__DIR__.'/../vendor/yii
在NGINX中配置:location/{   if(!-e$request_filename){    rewrite^/(.*)/index.phplast;}这样,当NGINX找不到文件的时候,就会将URL重写为index.php。对于URL中只有域名的情况,因为不存在对应的文件,所以会匹配到。再配置:location~\.php${  include
Yii2.0封装的类足够强大,Mailer的使用方法做一个总结:1、先在main-local.php中做好配置:return[//....'components'=>['mailer'=>['class'=>'yii\swiftmailer\Mailer',],],];详细如下:return[//....'components'=>[
每当我尝试登录我的Yii应用程序时,它都会显示错误CDbConnectionfailedtoopentheDBconnection:couldnotfinddriver.我google了很多个小时,从许多博客我知道我需要pdo_mysql,但已经安装了.在php.ini中我也对这些行做了评论;extension=php_pdo_mysql.dll;extension
我有一个模型Aziende,它与称为Annunci的花药模型相关(1:N),如下所示:'annunci'=>array(self::HAS_MANY,'Annunci','azienda_id'),我想算一下有多少记录确实有这种关系,在mySql中我会做:SELECTcount(*)FROM`aziende`aJOINannuncianONan.azienda_id=a.id我怎么能
我们有一个项目,为孟加拉国最大的服装行业之一建立一个ERP系统.他们有大约20,000名员工,其中约10%的员工每个月都会离职.我们是一家拥有5名PHP开发人员的小公司,对这么大的项目没有多少经验.我们之前使用Codeigniter/ZendFramework和MySQL数据库开发了不同的中小规模项目.对于
我在Yii中有一些表单,使用以下内容以下拉形式从相关表中获取数据列表:dropDownList(CHtml::listData(Company::model()->findAll(array('order'=>'companyASC'))));这是有效的,但这意味着对于每个下拉列表(其中很多)我将这个数组(‘order’=>’公司ASC’放在每一个中.这是最
本文采用Yii文档,经过自己的修改,让读者更容易理解预定义完整列表: boolean : CBooleanValidator 的别名,确保属性的值是CBooleanValidator::trueValue 或CBooleanValidator::falseValue .captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来
前面已经安装好了yii框架,现在我们来建立第一个Yii应用1、进入您网站更目录2、执行命令:YiiRoot/framework/yiicwebapptestdrive说明:这里的YiiRoot为您Yii框架的安装目录。3、输入以上命令后,会出现一个提示信息:PHPWarning:PHPStartup:Unabletol
一、ThinkPHPThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提
我必须实现标题中提到的验证,即需要两个字段之一(电子邮件,电话).我在我的模型中这样做:[['email'],'either',['other'=>['phone']]],这是方法:publicfunctioneither($attribute_name,$params){$field1=$this->getAttributeLabel($attribute_nam
我试图得到(StatusCode)响应RESTapi,而它只返回字段名称和错误消息,如下所示[{"field":"Email","message":"Email\"ali@ali.ali\"hasalreadybeentaken."}]我添加了回复'response'=>['class'=>'