日志管理,原创翻译

  近年来付出二个新的PHP项目,终于退出了某框架的魔爪(此前被煎熬的不轻),选择了人间中有名的Yii2框架。各个品种代码的周转,日志是不可缺少的,在付出中踩了二次Yii16日志管理的坑,看过众多网络对Yii二十八日志的安插介绍,明天计算一下Yii二对日记的拍卖分享给大家。

日志 Yii提供了一个冲天自定义化和高扩充性的日记框架。依据使用意况的两样,你能够很轻便的对种种音信就行记录、过滤、合并,举例说文本文件,数据库文件,邮件。

日志

Yii提供了一个惊人自定义化和高扩充性的日记框架。依据使用情状的例外,你能够很轻易的对各样新闻就行记录、过滤、合并,比如说文本文件,数据库文件,邮件。

接纳Yii的日记框架包涵如下步骤:

  • 调用日志记录的法子
  • 在主应用的布署文件(举个例子basic上面包车型客车web.php)中布局好日志的过滤和导出的安装
  • 自小编争论分裂景观下通过过滤之后的日志消息

  一.第二看一下log配置:

行使Yii的日记框架包含如下步骤:

笔录日志

笔录日志其实正是简轻便单的调用如下的措施:


地方的这几个艺术即使根据分歧的level和档案的次序来记录消息,不过其实它们调用的是同1个方法function($message,
$category =
‘application’)。在那之中$message就是要记录的新闻,$category表示的是其十二二十一日志的归属类。上面包车型客车代码表示在暗许的‘application’分类上边记录了一条trace类型的新闻。

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

提示:记录的$message能够是粗略的string也足以是繁体的数组、对象。你应该依附不相同的地方下日志记录的天职选择合适的$message类型。私下认可意况下,假若您记录的$message不是String,日志在导出的时候都会调用[[yii\helpers\VarDumper::export()]]
方法来输出1个string类型的新闻。

为了更加好的团体管理及筛选日志新闻,常常状态下应该为每壹种日志分合营适的连串。你能够选取1种有分明等第分别意思的归类,用以方便依照分裂的目的来筛选不一致分类的日记。一种简易且实用的命名情势正是选用PHP的魔术常量METHOD来作为分类的名称。Yii框架之中的主导代码在做日志记录的时候正是如此干的。比方说:

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

在有常量METHOD并发的地方,它意味着的正是眼前的不二等秘书籍的名号(并且增加了当前方式所属的类的欧洲经济共同体前缀)。比方吗,假设在app\controllers\RevenueController那个类里面的calculate方法里面有地点的那行代码,那么此时的METHOD代表的正是‘app\controllers\RevenueController::calculate’。

晋升:上面所说的艺术其实只是单例对象[[yii\log\Logger|logger
object]]
的[[yii\log\Logger::log()|log()]]艺术的大约利用,大家得以由此Yii::getLogger()方法来博取这些单例对象。当我们记录了丰硕的日记音讯依旧当前的应用运维甘休了,日志对象将调用[yii\log\Dispatcher|message
dispatcher]] 方法把记录的日记音讯写入到安插的目标地方。

 1 return [
 2     'traceLevel' => YII_DEBUG ? 3 : 0,
 3     'targets' => [     //可以配置多个log 
 4         [
 5             'class' => 'yii\log\FileTarget',  //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 ];

调用日志记录的方法

log targets

一个log
target是[[yii\log\Target]]依然其子类的实例。它依照严重的阶段和分类类过滤日志,然后把日志导出到适当的媒婆上边去。就比方,3个[[yii\log\DbTarget|database
target]] 对象就能把过滤之后的日志消息导出到相应数据库。
您能够在选用的布局文件中的日志组件处登记多少个log targets,就好像上面那样:

return [
// the “log” component must be loaded during bootstrapping time
‘bootstrap’ => [‘log’],

'components' => [
    'log' => [
        'targets' => [
            [
                'class' => 'yii\log\DbTarget',
                'levels' => ['error', 'warning'],
            ],
            [
                'class' => 'yii\log\EmailTarget',
                'levels' => ['error'],
                'categories' => ['yii\db\*'],
                'message' => [
                   'from' => ['log@example.com'],
                   'to' => ['admin@example.com', 'developer@example.com'],
                   'subject' => 'Database errors at example.com',
                ],
            ],
        ],
    ],
],
];
注意:日志组件必须在bootstrap中配置,这样才能把日志信息分发到对应的log target.

地点的代码里面,七个log
target注册到了[[yii\log\Dispatcher::targets]]里面。

  • 第三个筛选出荒谬和警示消息并且把那个音讯保存到了数据库。
  • 其次个筛选出分类以yii\db*发端的错误新闻,并把这个信息透过邮件发送到admin@example.com

    developer@example.com.

Yii有下边这几个内置的log
targets,你能够参考API文书档案来学习具体怎么去安顿和行使它们。


接下去,大家就来看看常见的log target具有的成效。

   二.日志记录

  • 在主应用的安排文件(比方basic下边包车型大巴web.php)中布局好日志的过滤和导出的装置
  • 检查差异景观下通过过滤之后的日记音信
  • 记录日志

音信过滤

就每1种log target来讲,你能够配备它的
[[yii\log\Target::levels|levels]] 和
[[yii\log\Target::categories|categories]]属性类设置它的严重程度以及归属的归类。
[[yii\log\Target::levels|levels]]性格的施用1个数组里面包车型地铁1个大概三个值,那个数组包罗如下值:

  • error:对应[Yii::error()]笔录的音信
  • warning:对应[Yii::warning()]记录的音信
  • info :对应
    [Yii::info()]记录的新闻
  • trace:对应
    [Yii::trace()]笔录的音信.
  • profile :对应[[Yii::beginProfile()]] 和
    [[Yii::endProfile()]]笔录的新闻,那种方法上面越来越多详细消息会被记录。

只要你未曾点名[[yii\log\Target::levels|levels]]
的值,那么其余level的音信都会被记录。
[[yii\log\Target::categories|categories]]
属性的值是数组,这些数组里面包车型地铁值能够是1个具体的归类名称,也得以是相仿正则的同盟情势。唯有在target能在那么些数组里面找到相应的归类名也许符合某一个相配形式,他才会管理这个新闻。这里的合作方式的构成是在分拣的名号后边加上3个号。借使这一个分类恰好和那一个匹配情势的号前的字符相配,那么也正是其壹分类找到对应匹配值。举个例来讲,在类[[yii\db\Command]]中的yii\日志管理,原创翻译。db\Command::execute和yii
\db\Command:: query
方法运用类名类记录相关日志音讯,那么今年他们都至极形式yii\db*

壹致的,如若大家从未点名[[yii\log\Target::categories|categories]],那么每1种分类的日志音信都会被管理。
除了通过[[yii\log\Target::categories|categories]]
属性来安装分类的白名单外,你也得以经过
[[yii\log\Target::except|except]]属性来安装分类的黑名单。属于黑名单的归类日志音讯不会被target管理。

上面包车型地铁安排钦命了三个分类相配yii\db*或者
yii\web\HttpException:*,但又不包蕴yii\web\HttpException:404的分类,而且它只管理错误和警戒的日记音信。

[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'categories' => [
    'yii\db\*',
    'yii\web\HttpException:*',
],
'except' => [
    'yii\web\HttpException:404',
],
]
注意:当错误的句柄捕获到HTTP的异常的时候,记录的日志信息会以yii\web\HttpException:ErrorCode的这种格式
记录,例如[[yii\web\NotFoundHttpException]] 就会被记录成yii\web\HttpException:404

    Yii::trace():记录一条音信去追踪一段代码是怎样运转的。这至关心爱护要在支付的时候利用。 
    Yii::info():记录一条音信来传达一些得力的音信。 
    Yii::warning():记录二个告诫音讯用来提醒一些业已产生的意外。 
    Yii::error():记录1个致命的谬误,那一个荒唐应该及早被检查。

笔录日志其实正是简轻易单的调用如下的办法:

信息格式化

日志targets用四种格式来导出日志。比方,假诺您的日志target是[yii\log\FileTarget],那么你在您的次第中著录日志的时候,应该会找到类似于文件runtime/log/app.log
记录的如下的新闻:

2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug

暗许情状下,[[yii\log\Target::formatMessage()]]:会帮我们把日记音信格式化成上面包车型客车那种格式:

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

您能够通过给[[yii\log\Target::prefix]]
属性配置三个自定义的回调函数来
自定义日志的前缀。上面包车型地铁代码就完结了在每条日志新闻前边加上了用户的ID(ip地址,sessionId等敏感音讯因为个人隐秘被去掉了)。

[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
    $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
    $userID = $user ? $user->getId(false) : '-';
    return "[$userID]";
}
]

除去日志音讯的前缀,日志的target还把一些上下文音信附加在了每一堆的日志记录中。私下认可情状下,全局的PHP变量包涵$_GET,
$_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SEKugaVEQX56. 你能够由此配备
[[yii\log\Target::logVars]]
来调度日志记录的全局变量。上面包车型地铁代码表示的是只记录$_SELANDVE卡宴相关的变量。

[
'class' => 'yii\log\FileTarget',
'logVars' => ['_SERVER'],
]


‘logVars’为空的时候,表示不记录相关的上下文音信。假让你想自定义上下文音讯的提供格局,你能够覆写[[亚洲必赢官网 ,yii\log\Target::getContextMessage()]]
方法。

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

  • [[Yii::trace()]]:
    记录关于某段代码运转的连锁消息。首假使用于开辟条件。
  • [[Yii::info()]]: 在少数地点记录一些比较有效的消息的时候利用。
  • [[Yii::warning()]]: 当某个期望之外的政工发生的时候,使用该方法。
  • [[Yii::error()]]:
    当有个别须要即刻消除的致命难点产生的时候,调用此方法记录相关信息。

消息的trace等级

在支付的长河当中,我们总是期望可以知道每一条日志音信是来源于何地。在Yii中你可以因此安排[[yii\log\Dispatcher::traceLevel|traceLevel]]
属性来促成。配置的言传身教如下:

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

地点的演示在YII_DEBUG为true的时候将[[yii\log\Dispatcher::traceLevel|traceLevel]]
设置为三,反之设置为0.
乐趣是哪些吧?3代表每一条日志记录都会记录与之相关的三层栈调用消息,0意味不记录任何相关的栈调用消息

提示:没有必要总是记录调用的堆栈信息,比较耗性能。所以,你应该只在你开发的时候或者用于调试的情况下使用该功能。

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

上边的那几个艺术纵然根据分歧的level和档期的顺序来记录音信,可是其实它们调用的是同1个方法function($message,
$category =
‘application’)。在那之中$message正是要记录的音讯,$category表示的是这些日志的归属类。下边包车型客车代码表示在默许的‘application’分类上面记录了一条trace类型的消息。

音信的清空和导出

就就像上边说的,记录的新闻以数组的花样保存在[[yii\log\Logger|logger
object]]中。为了限制那个数组消耗过多的内部存款和储蓄器,当以此数组包罗的开始和结果大小达到某些量的时候会被相应的target从内部存款和储蓄器中转移到对应的对象(文件,数据库…)中。你能够透过安装
[[yii\log\Dispatcher::flushInterval|flushInterval]]
的值来决定量的轻重缓急。像上面那样:

return [
'bootstrap' => ['log'],
'components' => [
    'log' => [
        'flushInterval' => 100,   // default is 1000
        'targets' => [...],
    ],
],
];
注意:在应用运行结束的时候也会刷新内存,这样做事为了让日志的target能够记录完整的信息。

把日志消息从内部存款和储蓄器刷到相应存放的地点的这一动作不是立时发出的。事实上,和地方一样,都以当内部存款和储蓄器中的日记大小达到一定水平才会发出。你能够像下边包车型客车言传身教一样通过安顿分化target的[[yii\log\Target::exportInterval|exportInterval]]值,来达到修改的目标:

[
'class' => 'yii\log\FileTarget',
'exportInterval' => 100,  // default is 1000
]

因为清空和导出的设定,暗中同意情状下你调用 Yii::trace()
大概别的的日记记录格局的时候不会在日志target下立刻看到日志消息。那对某个长日子运作的调整台程序是3个主题素材。可是那些标题是足以消除的,方法入上边包车型客车代码,你需求把[[yii\log\Dispatcher::flushInterval|flushInterval]]
和[[yii\log\Target::exportInterval|exportInterval]]
的值都设置成一:

return [
'bootstrap' => ['log'],
'components' => [
    'log' => [
        'flushInterval' => 1,
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'exportInterval' => 1,
            ],
        ],
    ],
],
];
注意:如此频繁的清空和导出日志消息会降低系统的性能。

  三.日志组件调用

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

切换日志的targets

你可以透过安装[[yii\log\Target::enabled|enabled]]
属性来禁止日志的target。就犹如上边包车型大巴代码描述的同一:

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

上边的代码须求您在陈设文件之中有1个底下的安排:

return [
'bootstrap' => ['log'],
'components' => [
    'log' => [
        'targets' => [
            'file' => [
                'class' => 'yii\log\FileTarget',
            ],
            'db' => [
                'class' => 'yii\log\DbTarget',
            ],
        ],
    ],
],
];

    log配置通过web.php(基础模板web.php
高档模板main.php)以component格局加载到应用对象Yii::$app中。

提拔:记录的$message能够是回顾的string也能够是繁体的数组、对象。你应当依据分化的光景下日志记录的职务选用合适的$message类型。暗许情状下,假设你记录的$message不是String,日志在导出的时候都会调用[[yii\helpers\VarDumper::export()]]
方法来输出贰个string类型的新闻。

创办二个新的target

第叁,成立一个新的日志target是很简单的。你根本做的工作是兑现[[yii\log\Target::export()]]
方法并且把数组类型的新闻[[yii\log\Target::messages]]发送到钦点的存款和储蓄媒介上去就行了。在这么些进程中你能够调用[[yii\log\Target::formatMessage()]]
方法来格式化每一条日志音讯。至于更加多的细节你能够在Yiid的发行版本里找到详细的新闻。

  四.日记切分

为了更加好的集团管制及筛选日志音信,日常景况下应该为每1种日志分协作适的种类。你能够接纳一种有鲜明品级区分意思的归类,用以方便依据分裂的目标来筛选分裂分类的日志。一种轻松且实用的命名情势正是运用PHP的魔术常量METHOD来作为分类的名称。Yii框架之中的着力代码在做日志记录的时候正是那样干的。比如说:

品质测验评定

质量测验评定是一种相比较尤其的日记记录。它经常用来得到某个模块实施时间的数目,以此来找到质量的难点所在。举例说,[[yii\db\Command]]
这些类就用品质测验评定日志来博取每一条sql查询所消费的年月。

要利用该类日志,你首先要做的时规定你要测试的代码范围。然后在每一段代码之间你都应该要有限扶助它们是密闭的,就如上面那一个样子:

\Yii::beginProfile('myBenchmark');
...code block being profiled...
\Yii::endProfile('myBenchmark');

myBenchmark只是多个标记,用于你在翻六柱预测应日志记录的时候飞快稳固。
在beginProfile和endProfile之间是足以再嵌套的,可是必须保障科学的关闭关系,如下所示:

\Yii::beginProfile(‘block1’);

// some code to be profiled

\Yii::beginProfile('block2');
    // some other code to be profiled
\Yii::endProfile('block2');

\Yii::endProfile('block1');

1旦地方的密闭关系出错了,对应的记录都不会健康干活。

对于每1块被测验评定的代码,日志的level都是profile。你能够再日志的target中配置那一个音信并导出它们。
Yii内建了 Yii
debugger来展现评测的结果。

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

Yii::trace('start calculating average revenue', __METHOD__);
 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 }

在有常量METHOD出现的地点,它象征的正是日前的措施的称谓(并且拉长了最近艺术所属的类的总体前缀)。举例吗,假如在app\controllers\RevenueController这么些类里面包车型地铁calculate方法里面有地点的那行代码,那么此时的METHOD表示的正是‘app\controllers\RevenueController::calculate’。

  五.日志前缀

提醒:下面所说的措施其实只是单例对象[[yii\log\Logger|logger
object]]
的[[yii\log\Logger::log()|log()]]办法的简便利用,我们可以通过Yii::getLogger()方法来博取这一个单例对象。当大家记录了10足的日志新闻也许当前的选取运营甘休了,日志对象将调用[yii\log\Dispatcher|message
dispatcher]] 方法把记录的日志新闻写入到安排的目标地方。

    prefix:借使没有配备,私下认可调用./vendor/yiisoft/yii2/log/Target.php

log targets 一个log
target是[[yii\log\Target]]抑或其子类的实例。它根据严重的级差和分类类过滤日志,然后把日记导出到合适的红娘上边去。就比如,三个[[yii\log\DbTarget|database
target]] 对象就能把过滤之后的日记消息导出到对应数据库。
你能够在利用的布署文件中的日志组件处登记多少个log targets,就像上边那样:

 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 \yii\web\User */
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 \yii\web\Session */
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 }
return [
// the "log" component must be loaded during bootstrapping time
'bootstrap' => ['log'],

'components' => [
  'log' => [
    'targets' => [
      [
        'class' => 'yii\log\DbTarget',
        'levels' => ['error', 'warning'],
      ],
      [
        'class' => 'yii\log\EmailTarget',
        'levels' => ['error'],
        'categories' => ['yii\db\*'],
        'message' => [
          'from' => ['log@example.com'],
          'to' => ['admin@example.com', 'developer@example.com'],
          'subject' => 'Database errors at example.com',
        ],
      ],
    ],
  ],
],
];

     借使想要自定义日志格式前缀,能够布置回调函数(note:假诺在回调中使用了特定的类须求在文书先导用“use”关键词
引入该类)

留神:日志组件必须在bootstrap中配置,那样技巧把日志新闻分发到相应的log
target.
上边的代码里面,多少个log
target注册到了[[yii\log\Dispatcher::targets]]里面。

亚洲必赢官网 1

先是个筛选出荒谬和警告新闻并且把那个音信用保证存到了数据库。
其次个筛选出分类以yii\db*千帆竞发的错误消息,并把那一个音讯通过邮件发送到admin@example.com
和 developer@example.com.
Yii有上面那一个内置的log
targets,你能够参考API文书档案来上学习用具体怎么去布置和动用它们。

 

  • [[yii\log\DbTarget]]:把日记音信保存到数据库。
  • [[yii\log\EmailTarget]]:
    把日记消息发送到钦赐的信箱,上边的例子就是。
  • [[yii\log\FileTarget]]: 把日志写到到文件。
  • [[yii\log\SyslogTarget]]:
    调用PHP的syslog()方法将日志写入到系统日志。

接下去,我们就来探望常见的log target具备的效益。

音信过滤 就每一种log target来讲,你能够铺排它的
[[yii\log\Target::levels|levels]] 和
[[yii\log\Target::categories|categories]]属性类设置它的不得了程度以及归属的分类。
[[yii\log\Target::levels|levels]]属性的行使3个数组里面包车型客车1个要么多少个值,这些数组包括如下值:

  • error:对应[[Yii::error()]]笔录的新闻
  • warning:对应[[Yii::warning()]]笔录的音信
  • info :对应 [[Yii::info()]]记录的信息
  • trace:对应 [[Yii::trace()]]记录的消息.
  • profile :对应[[Yii::beginProfile()]] 和
    [[Yii::endProfile()]]记录的新闻,那种艺术上边越来越多详细新闻会被记录。

如若您从未点名[[yii\log\Target::levels|levels]]
的值,那么此外level的新闻都会被记录。

[[yii\log\Target::categories|categories]]
属性的值是数组,这么些数组里面的值可以是1个具体的归类名称,也能够是接近正则的协作格局。唯有在target能在那个数组里面找到相应的归类名或然符合某贰个金童玉女形式,他才会管理那几个新闻。这里的合作形式的重组是在分拣的名目后边加上三个号。若是这一个分类恰好和这几个相配格局的号前的字符匹配,那么也正是其一分类找到对应相配值。举个例来讲,在类[[yii\db\Command]]中的yii\db\Command::execute和yii
\db\Command:: query
方法应用类名类记录相关日志消息,那么今年她们都协作方式yii\db*

同1的,假若大家一直不点名[[yii\log\Target::categories|categories]],那么每1种分类的日记音讯都会被拍卖。
除开通过[[yii\log\Target::categories|categories]]
属性来安装分类的白名单外,你也足以通过
[[yii\log\Target::except|except]]质量来设置分类的黑名单。属于黑名单的分类日志音讯不会被target处理。

上面包车型大巴配置内定了七个分拣相配yii\db*或者
yii\web\HttpException:*,但又不包罗yii\web\HttpException:40四的归类,而且它只管理错误和警示的日志音讯。

[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'categories' => [
  'yii\db\*',
  'yii\web\HttpException:*',
],
'except' => [
  'yii\web\HttpException:404',
],
]

小心:当错误的句柄捕获到HTTP的异常的时候,记录的日志音信会以yii\web\HttpException:ErrorCode的那种格式
记录,例如[[yii\web\NotFoundHttpException]]
就能够被记录成yii\web\HttpException:404
音讯格式化 日志targets用多样格式来导出日志。比方,假若您的日志target是[[yii\log\FileTarget]],那么你在你的次序中记录日志的时候,应该会找到类似于文件runtime/log/app.log
记录的如下的音信:

2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug

默许意况下,[[yii\log\Target::formatMessage()]]:会帮大家把日志消息格式化成上面包车型大巴那种格式:

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

您能够透过给[[yii\log\Target::prefix]]
属性配置八个自定义的回调函数来
自定义日志的前缀。上边包车型客车代码就贯彻了在每条日志消息后面加上了用户的ID(ip地址,sessionId等敏感新闻因为个人隐秘被去掉了)。

[
'class' => 'yii\log\FileTarget',
'prefix' => function ($message) {
  $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
  $userID = $user ? $user->getId(false) : '-';
  return "[$userID]";
}
]

除此而外日志音讯的前缀,日志的target还把有个别上下文消息附加在了每一堆的日志记录中。暗中认可情状下,全局的PHP变量蕴含$_GET,
$_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SE索罗德VE福特Explorer. 你能够经过安顿
[[yii\log\Target::logVars]]
来调解日志记录的全局变量。下边包车型地铁代码表示的是只记录$_SE大切诺基VE奥迪Q伍相关的变量。

[
'class' => 'yii\log\FileTarget',
'logVars' => ['_SERVER'],
]


‘logVars’为空的时候,表示不记录相关的上下文新闻。假若您想自定义上下文新闻的提供格局,你能够覆写[[yii\log\Target::getContextMessage()]]
方法。

消息的trace等级 在支付的进程个中,我们连年期望能够领略每一条日志消息是缘于哪儿。在Yii中您能够透过安插[[yii\log\Dispatcher::traceLevel|traceLevel]]
属性来兑现。配置的示范如下:

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

下边包车型地铁言传身教在YII_DEBUG为true的时候将[[yii\log\Dispatcher::traceLevel|traceLevel]]
设置为3,反之设置为0.
情趣是哪些吗?三意味每一条日志记录都会记录与之相关的三层栈调用音讯,0象征不记录任何有关的栈调用消息

提醒:不需求总是记录调用的旅馆新闻,比较耗品质。所以,你应当只在您付出的时候依然用于调节和测试的事态下行使该成效。
音信的清空和导出 就犹如上面说的,记录的新闻以数组的样式保存在[[yii\log\Logger|logger
object]]中。为了限制那个数组消耗过多的内部存款和储蓄器,当那一个数组包罗的剧情大小到达有些量的时候会被相应的target从内部存款和储蓄器中间转播移到相应的靶子(文件,数据库…)中。你能够因此设置
[[yii\log\Dispatcher::flushInterval|flushInterval]]
的值来决定量的大大小小。像上边那样:

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

在意:在利用运转截止的时候也会刷新内部存款和储蓄器,那样职业为了让日志的target能够记录完整的音信。
把日记音信从内部存款和储蓄器刷到对应存放的地点的这一动作不是立时产生的。事实上,和上边同样,都以当内部存款和储蓄器中的日志大小达到自然程度才会时有产生。你能够像上边包车型大巴以身作则同样通过计划分歧target的[[yii\log\Target::exportInterval|exportInterval]]值,来完毕修改的目标:

[
'class' => 'yii\log\FileTarget',
'exportInterval' => 100, // default is 1000
]

因为清空和导出的设定,暗中认可情状下您调用 Yii::trace()
或然其余的日志记录方式的时候不会在日志target下即刻看到日志消息。那对少数长日子运作的调整台程序是二个标题。可是这一个难题是足以缓慢解决的,方法入上边的代码,你要求把[[yii\log\Dispatcher::flushInterval|flushInterval]]
和[[yii\log\Target::exportInterval|exportInterval]]
的值都设置成一:

return [
'bootstrap' => ['log'],
'components' => [
  'log' => [
    'flushInterval' => 1,
    'targets' => [
      [
        'class' => 'yii\log\FileTarget',
        'exportInterval' => 1,
      ],
    ],
  ],
],
];

留意:如此反复的清空和导出日志音信会减低系统的习性。
切换日志的targets 你能够透过安装[[yii\log\Target::enabled|enabled]]
属性来禁止日志的target。就不啻上面包车型地铁代码描述的同壹:

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

上边的代码必要你在铺排文件之中有三个底下的计划:

return [
'bootstrap' => ['log'],
'components' => [
  'log' => [
    'targets' => [
      'file' => [
        'class' => 'yii\log\FileTarget',
      ],
      'db' => [
        'class' => 'yii\log\DbTarget',
      ],
    ],
  ],
],
];

始建三个新的target 第叁,创制1个新的日志target是极粗略的。你根本做的事务是得以完成[[yii\log\Target::export()]]
方法并且把数组类型的音信[[yii\log\Target::messages]]发送到钦命的贮存媒介上去就行了。在这些历程中您能够调用[[yii\log\Target::formatMessage()]]
方法来格式化每一条日志音讯。至于越来越多的底细你能够在Yiid的批发版本里找到详细的新闻。

天性测验评定 个性测验评定是一种相比较特其他日志记录。它平时用来取得有个别模块试行时间的数目,以此来找到品质的难点所在。比如说,[[yii\db\Command]]
那个类就用品质测验评定日志来博取每一条sql查询所消费的年华。

要采纳该类日志,你首先要做的时规定你要测试的代码范围。然后在每1段代码之间你都应有要维持它们是虚掩的,就如下边那一个样子:

\Yii::beginProfile('myBenchmark');
...code block being profiled...
\Yii::endProfile('myBenchmark');

myBenchmark只是3个标志,用于你在查阅相应日志记录的时候火速牢固。
在beginProfile和endProfile之间是足以再嵌套的,不过必须保障科学的关闭关系,如下所示:

\Yii::beginProfile('block1');

// some code to be profiled

\Yii::beginProfile('block2');
  // some other code to be profiled
\Yii::endProfile('block2');

\Yii::endProfile('block1');

要是地方的密闭关系出错了,对应的记录都不会平常职业。

对于每一块被测验评定的代码,日志的level都以profile。你能够再日志的target中配置这么些新闻并导出它们。
Yii内建了 Yii debugger来展现评测的结果。

您恐怕感兴趣的篇章:

  • 完善解读PHP的Yii框架中的日志功用
  • 详解PHP的Yii框架中国和东瀛记的相干陈设及应用
  • Yii二框架中国和东瀛记的选取格局分析
  • YII
    Framework框架教程之日志用法详解
  • Yii框架落成记录日志到自定义文件的主意
  • yii框架配置默许controller和action示例
  • PHP的Yii框架中应用数据库的配置和SQL操作实例教程
  • Nginx配置PHP的Yii与CakePHP框架的rewrite规则示例
  • Yii框架日志记录Logging操作示例
网站地图xml地图