PHP的Yii框架的常用日志操作总括_php技艺_脚本之家

作者:编程技术

      第一个参数能够是自定义的日志分类,对应配置文件中categories字段。

[[yiilogDbTarget]]:把日记新闻保存到数据库。 [[yiilogEmailTarget]]: 把日志音讯发送到内定的信箱,上边的例子正是。 [[yiilogFileTarget]]: 把日记写到到文件。 [[yiilogSyslogTarget]]: 调用PHP的syslog(卡塔尔方法将日志写入到系统日志。

     假使想要自定义日志格式前缀,可以安排回调函数(note:借使在回调中应用了特定的类须求在文件开端用“use”关键词 引进该类)

消息的trace等级在开采的进度当中,我们连年希望能够掌握每一条日志新闻是来自哪个地方。在Yii中您能够透过布署[[yiilogDispatcher::traceLevel|traceLevel]] 属性来兑现。配置的身体力行如下:

  5.日志前缀

Yii::$app->log->targets['file']->enabled = false;

    Yii::trace(卡塔尔(英语:State of Qatar):记录一条音讯去追踪后生可畏段代码是怎么样运维的。那主要在支付的时候使用。 
    Yii::info(卡塔尔(قطر‎:记录一条音讯来传达一些卓有作用的音信。 
    Yii::warning(卡塔尔:记录多个警示音信用来提示一些早就爆发的竟然。 
    Yii::error(卡塔尔(英语:State of Qatar):记录三个沉重的大错特错,那么些张冠李戴应该尽快被检查。

日志Yii提供了一个惊人自定义化和高扩充性的日记框架。遵照使用境况的不等,你能够超轻巧的对种种新闻就能够记录、过滤、归并,例如说文本文件,数据库文件,邮件。

  方今付出八个新的PHP项目,终于脱离了某框架的铁蹄(此前被折腾的不轻),选拔了尘间中盛名的Yii2框架。种种连串代码的运维,日志是尤为重要的,在支付中踩了三次Yii2日志处理的坑,看过众多互连网对Yii2日志的配备介绍,明日总括一下Yii2对日记的管理分享给大家。

地点的那些办法即使依据差异的level和类型来记录音信,不过实际它们调用的是同一个方法function($message, $category = 'application'卡塔尔国。在那之中$message正是要记录的音讯,$category代表的是以此日志的归属类。上面包车型地铁代码表示在暗中同意的‘application'分类上边记录了一条trace类型的音信。

分分快三计划 1

因为清空和导出的设定,私下认可景况下您调用 Yii::trace(卡塔尔(英语:State of Qatar)也许别的的日志记录方式的时候不会在日志target下立刻看见日志音信。那对一些长日子运作的调整台程序是多个难点。然则那些主题素材是能够消除的,方法入上面包车型大巴代码,你要求把[[yiilogDispatcher::flushInterval|flushInterval]] 和[[yiilogTarget::exportInterval|exportInterval]] 的值都设置成1:

    log配置通过web.php(底子模板web.php 高端模板main.php卡塔尔(英语:State of Qatar)以component方式加载到使用对象Yii::$app中。

注意:在使用运营停止的时候也会刷新内部存款和储蓄器,那样职业为了让日志的target能够记录完整的新闻。把日记消息从内部存储器刷到对应寄存之处的这一动作不是任何时候爆发的。事实上,和方面相符,都是当内部存款和储蓄器中的日志大小达到自然水准才会产生。你能够像上面包车型客车演示相仿通过安插差别target的[[yiilogTarget::exportInterval|exportInterval]]值,来完毕矫正的指标:

   2.日志记录

['class' => 'yiilogFileTarget','prefix' => function  { $user = Yii::$app->has ? Yii::$app->get : null; $userID = $user ? $user->getId : '-'; return "[$userID]";}]
 1 return [
 2     'traceLevel' => YII_DEBUG ? 3 : 0,
 3     'targets' => [     //可以配置多个log 
 4         [
 5             'class' => 'yiilogFileTarget',  //Yii2处理日志的类
 6             'levels' => ['error', 'warning', 'info'], //设置日志记录的级别
 7             'categories' => ['user'], //自定义日志分类
 8             'maxFileSize' => 1024 * 20,  //设置文件大小,以k为单位
 9             'logFile' => '@runtime/../logs/user'.date('Ymd'), //自定义文件路径 (一般项目的日志会打到服务器的其他路径,需要修改相应目录的权限哦~)
10             'logVars' => ['_POST'],  //捕获请求参数
11             'fileMode' => 0775, //设置日志文件权限
12             'maxLogFiles' => 100,  //同个文件名最大数量
13             'rotateByCopy' => false, //是否以复制的方式rotate
14             'prefix' => function() {   //日志格式自定义 回调方法
15                 if (Yii::$app === null) {
16                     return '';
17                 }
18                 $request = Yii::$app->getRequest();
19                 $ip = $request instanceof Request ? $request->getUserIP() : '-';
20                 $controller = Yii::$app->controller->id;
21                 $action = Yii::$app->controller->action->id;
22                 return "[$ip][$controller-$action]";
23             },
24         ],
25 ];

[[yiilogTarget::categories|categories]] 属性的值是数组,那一个数组里面的值能够是多少个切实的归类名称,也能够是周边正则的协作方式。只有在target能在此个数组里面找到相应的归类名或然切合某三个协作情势,他才会管理那些音讯。这里的协作情势的重新整合是在分拣的名近期面加上三个号。纵然那个分类刚巧和那一个相配格局的号前的字符相配,那么也正是其一分类找到对应相配值。举个例来讲,在类[[yiidbCommand]]中的yiidbCommand::execute和yii dbCommand:: query 方法运用类名类记录相关日志音信,那么那个时候他俩都杰出模式yiidb*

 1 class FileTarget extends Target
 2 {
 3     public $logFile;
 4     //rotation开关  如果开启,当日志文件大于maxFileSize设定的文件大小之后,就会自动切分日志
 5     public $enableRotation = true;    
 6     public $maxFileSize = 10240; // in KB
 7     //同一个文件名可以切分多少个文件
 8     public $maxLogFiles = 5;
 9     public $fileMode; //日志文件权限
10     public $dirMode = 0775; 
11     /**
12      * @var bool Whether to rotate log files by copy and truncate in contrast to rotation by
13      * renaming files. Defaults to `true` to be more compatible with log tailers and is windows
14      * systems which do not play well with rename on open files. Rotation by renaming however is
15      * a bit faster.
16      *
17      * The problem with windows systems where the [rename()](http://www.php.net/manual/en/function.rename.php)
18      * function does not work with files that are opened by some process is described in a
19      * [comment by Martin Pelletier](http://www.php.net/manual/en/function.rename.php#102274) in
20      * the PHP documentation. By setting rotateByCopy to `true` you can work
21      * around this problem.
22      */ 
23     public $rotateByCopy = true;
24 
25     /**
26      * Rotates log files.
27      */
28     protected function rotateFiles()
29     {
30         $file = $this->logFile;
31         for ($i = $this->maxLogFiles; $i >= 0; --$i) {
32             // $i == 0 is the original log file
33             $rotateFile = $file . ($i === 0 ? '' : '.' . $i);
34             if (is_file($rotateFile)) {
35                 // suppress errors because it's possible multiple processes enter into this section
36                 if ($i === $this->maxLogFiles) {
37                     @unlink($rotateFile);
38                 } else {
39                     if ($this->rotateByCopy) {
40                         @copy($rotateFile, $file . '.' . ($i   1));
41                         if ($fp = @fopen($rotateFile, 'a')) {
42                             @ftruncate($fp, 0);
43                             @fclose($fp);
44                         }
45                         if ($this->fileMode !== null) {
46                             @chmod($file . '.' . ($i   1), $this->fileMode);
47                         }
48                     } else {
49                         // linux下用rename方式
50                         @rename($rotateFile, $file . '.' . ($i   1));
51                     }
52                 }
53             }
54         }
55     }
56 }

唤醒:上边所说的方法其实只是单例对象[[yiilogLogger|logger object]] 的[[yiilogLogger::log]]方法的大致利用,大家得以经过Yii::getLogger(卡塔尔(英语:State of Qatar)方法来赢得这么些单例对象。当大家记录了丰裕的日记消息如故当前的接收运转结束了,日志对象将调用[yiilogDispatcher|message dispatcher]] 方法把记录的日志音讯写入到布署的目标地方。

 1 public function getMessagePrefix($message)
 2 {
 3     if ($this->prefix !== null) {
 4         return call_user_func($this->prefix, $message);
 5     }
 6 
 7     if (Yii::$app === null) {
 8         return '';
 9     }
10 
11     $request = Yii::$app->getRequest();
12     $ip = $request instanceof Request ? $request->getUserIP() : '-';
13 
14     /* @var $user yiiwebUser */
15     $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
16     if ($user && ($identity = $user->getIdentity(false))) {
17         $userID = $identity->getId();
18     } else {
19         $userID = '-';
20     }
21 
22     /* @var $session yiiwebSession */
23     $session = Yii::$app->has('session', true) ? Yii::$app->get('session') : null;
24     $sessionID = $session && $session->getIsActive() ? $session->getId() : '-';
25 
26     return "[$ip][$userID][$sessionID]";
27 }

属性评测属性测评是黄金年代种比较非常的日志记录。它常常用来拿到有个别模块施行时间的数码,以此来找到质量的难点所在。比方说,[[yiidbCommand]] 这些类就用质量测评日志来获得每一条sql查询所花费的日子。

  4.日记切分

瞩目:如此频仍的清空和导出日志音讯会骤降系统的性质。切换日志的targets您能够因而设置[[yiilogTarget::enabled|enabled]] 属性来禁绝日志的target。就像是同上面包车型大巴代码描述的如出大器晚成辙:

 

Yii::trace('start calculating average revenue', __METHOD__);

  1.率先看一下log配置:

精心:日志组件必得在bootstrap中安顿,那样本事把日记音讯分发到相应的log target.上边的代码里面,七个log target注册到了[[yiilogDispatcher::targets]]里面。

    prefix:若无配备,暗中同意调用./vendor/yiisoft/yii2/log/Target.php

如出后生可畏辙的,假诺大家从不点名[[yiilogTarget::categories|categories]],那么每生龙活虎种分类的日记消息都会被管理。除了通过[[yiilogTarget::categories|categories]] 属性来安装分类的白名单外,你也可以经过 [[yiilogTarget::except|except]]性情来安装分类的黑名单。归于黑名单的归类日志音讯不会被target管理。

    ./vendor/yiisoft/yii2/log/FileTarget.php

留心:当错误的句柄捕获到HTTP的十三分的时候,记录的日记音信会以yiiwebHttpException:ErrorCode的这种格式记录,举个例子[[yiiwebNotFoundHttpException]] 就能够被记录成yiiwebHttpException:404音信格式化日志targets用八种格式来导出日志。比如,如若您的日志target是[[yiilogFileTarget]],那么您在您的次第中著录日志的时候,应该会找到相似于文件runtime/log/app.log 记录的如下的音讯:

    eg: Yii::info('the log content', 'user');

 Yii::trace('start calculating average revenue');

  3.日志构件调用

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

您可以经过给[[yiilogTarget::prefix]] 属性配置八个自定义的回调函数来 自定义日志的前缀。上边包车型大巴代码就贯彻了在每条日志新闻前边加上了客户的ID(ip地址,sessionId等趁机音讯因为个人隐衷被去掉了)。

首先个筛选出错误和警报新闻同不常候把那几个新闻保存到了数据库。第三个挑选出分类以yiidb*最早的错误新闻,并把这一个音信通过邮件发送到admin@example.com 和 developer@example.com.Yii有上边这个内置的log targets,你能够参考API文书档案来学习具体怎么去布置和行使它们。

要利用该类日志,你首先要做的时规定你要测量检验的代码范围。然后在每大器晚成段代码之间你都一定要保持它们是密封的,犹如上边那个样子:

['class' => 'yiilogFileTarget','levels' => ['error', 'warning'],'categories' => [ 'yiidb*', 'yiiwebHttpException:*',],'except' => [ 'yiiwebHttpException:404',],]

下面包车型地铁布署钦定了二个分类相配yiidb*或者 yiiwebHttpException:*,但又不富含yiiwebHttpException:404的归类,并且它只管理错误和警报的日志音信。

return ['bootstrap' => ['log'],'components' => [ 'log' => [ 'flushInterval' => 100, // default is 1000 'targets' => [...], ],],];

在有常量METHOD现身之处,它象征的就是眼下的不二诀要的名称。比如吗,假如在appcontrollersRevenueController那个类里面包车型客车calculate方法里面有地点的那行代码,那么那时的METHOD表示的正是‘appcontrollersRevenueController::calculate'。

接下去,我们就来看看科学普及的log target具备的职能。

['class' => 'yiilogFileTarget','exportInterval' => 100, // default is 1000]

myBenchmark只是贰个标记,用于你在翻占卜应日志记录的时候神速稳定。在beginProfile和endProfile之间是足以再嵌套的,不过必需保险科学的关闭关系,如下所示:

行使Yii的日志框架包括如下步骤:

私下认可情形下,[[yiilogTarget::formatMessage()]]:会帮大家把日记新闻格式化成上面包车型客车这种格式:

上边的代码必要你在配备文件之中有八个底下的安插:

对此每一块被评测的代码,日志的level都是profile。你能够再日志的target中安插这么些新闻并导出它们。 Yii内建了 Yii debugger来体现评测的结果。

当 'logVars'为空的时候,表示不记录相关的上下文消息。假设您想自定义上下文消息的提供情势,你能够覆写[[yiilogTarget::getContextMessage()]] 方法。

error:对应[[Yii::error()]]笔录的音信warning:对应[[Yii::warning()]]笔录的新闻 info :对应 [[Yii::info()]]笔录的音讯 trace:对应 [[Yii::trace()]]笔录的新闻. profile :对应[[Yii::beginProfile()]] 和 [[Yii::endProfile()]]记录的音讯,这种艺术下边更多详细信息会被记录。

return ['bootstrap' => ['log'],'components' => [ 'log' => [ 'flushInterval' => 1, 'targets' => [ [ 'class' => 'yiilogFileTarget', 'exportInterval' => 1, ], ], ],],];
Yii::beginProfile;...code block being profiled...Yii::endProfile;

[[Yii::trace()]]: 记录关于某段代码运转的有关新闻。主若是用来开采条件。 [[Yii::info()]]: 在少数地方记录一些比较平价的音讯的时候利用。 [[Yii::warning()]]: 当有个别期待之外的事情爆发的时候,使用该办法。 [[Yii::error()]]: 当有些须要即刻消灭的致命难题爆发的时候,调用此办法记录相关新闻。

在主应用的配置文件中布署好日志的过滤和导出的装置 检查不相同情况下通过过滤之后的日记音信 记录日志

log targets一个log target是[[yiilogTarget]]依然其子类的实例。它依照严重的级差和分类类过滤日志,然后把日志导出到特出的媒婆下面去。就比如,两个[[yiilogDbTarget|database target]] 对象就能够把过滤之后的日志消息导出到相应数据库。你能够在采纳的安顿文件中的日志组件处登记多个log targets,有如下面那样:

如若上边的关闭关系出错了,对应的笔录都不会健康干活。

假如您未曾点名[[yiilogTarget::levels|levels]] 的值,那么其余level的新闻都会被记录。

下面的身体力行在YII_DEBUG为true的时候将[[yiilogDispatcher::traceLevel|traceLevel]] 设置为3,反之设置为0. 意思是哪些啊?3意味着每一条日志记录都会记录与之相关的三层栈调用音讯,0表示不记录任何相关的栈调用音信

音信过滤就每生机勃勃种log target来说,你能够配备它的 [[yiilogTarget::levels|levels]] 和 [[yiilogTarget::categories|categories]]属性类设置它的深重程度以至归于的归类。[[yiilogTarget::levels|levels]]天性的行使二个数组里面包车型地铁三个照旧多个值,那几个数组包括如下值:

除了这一个之外日志新闻的前缀,日志的target还把一些上下文音信附加在了每一群的日志记录中。暗许情形下,全局的PHP变量满含$_GET, $_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SELacrosseVEHaval. 你能够通过布置 [[yiilogTarget::logVars]] 来调节日志记录的全局变量。上面包车型地铁代码表示的是只记录$_SECR-VVE昂Cora相关的变量。

return ['bootstrap' => ['log'],'components' => [ 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [...], ],],];

提示:不须求总是记录调用的仓库音讯,比较耗品质。所以,你应当只在您付出的时候仍然用于调节和测验的情形下利用该意义。消息的清空和导出就就好像下边说的,记录的音信以数组的花样保存在[[yiilogLogger|logger object]]中。为了约束那么些数组消耗过多的内存,当以此数组富含的源委大小到达有些量的时候会被相应的target从内部存款和储蓄器中间转播移到对应的目的中。你能够透过安装 [[yiilogDispatcher::flushInterval|flushInterval]] 的值来决定量的轻重缓急。像上边这样:

Yii::beginProfile;// some code to be profiledYii::beginProfile; // some other code to be profiledYii::endProfile;Yii::endProfile;

始建一个新的target先是,创造一个新的日志target是很简短的。你根本做的事务是促成[[yiilogTarget::export()]] 方法况且把数组类型的新闻[[yiilogTarget::messages]]发送到钦命的存放媒介上去就行了。在那个历程中你可以调用[[yiilogTarget::formatMessage()]] 方法来格式化每一条日志音信。至于越多的内部情形你能够在Yiid的批发版本里找到详细的音讯。

唤醒:记录的$message能够是简约的string也得以是眼花缭乱的数组、对象。你应有依照分歧的风貌下日志记录的职分选用合适的$message类型。默许意况下,如果你记录的$message不是String,日志在导出的时候都会调用[[yiihelpersVarDumper::export()]] 方法来输出二个string类型的新闻。

为了更加好的团组织管制及筛选日志音信,平常情形下应当为每意气风发种日志分同盟适的品类。你能够接收风姿洒脱种有分明等第区分意思的分类,用以方便依据差别的目标来筛选分裂分类的日志。豆蔻年华种轻易且使得的命名格局正是行使PHP的魔术常量METHOD来作为分类的称呼。Yii框架之中的为主代码在做日志记录的时候正是那样干的。比如说:

return [// the "log" component must be loaded during bootstrapping time'bootstrap' => ['log'],'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yiilogDbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yiilogEmailTarget', 'levels' => ['error'], 'categories' => ['yiidb*'], 'message' => [ 'from' => ['log@example.com'], 'to' => ['admin@example.com', 'developer@example.com'], 'subject' => 'Database errors at example.com', ], ], ], ],],];

调用日志记录的点子

return ['bootstrap' => ['log'],'components' => [ 'log' => [ 'targets' => [ 'file' => [ 'class' => 'yiilogFileTarget', ], 'db' => [ 'class' => 'yiilogDbTarget', ], ], ],],];
2014-10-04 18:10:15 [::1][][-][trace][yiibaseModule::getModule] Loading module: debug
['class' => 'yiilogFileTarget','logVars' => ['_SERVER'],]

记录日志其实正是简轻松单的调用如下的章程:

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 常用 框架 脚本 之家