日志处理,PHP的Yii框架的常用日志操作总结

2019-05-03 22:42 来源:未知

  五.日志前缀

在有常量METHOD出现的地方,它象征的就是目前的格局的称号(并且增加了脚下艺术所属的类的完好前缀)。比如吗,假设在appcontrollersRevenueController这么些类里面包车型大巴calculate方法里面有地点的那行代码,那么此时的METHOD表示的正是‘appcontrollersRevenueController::calculate'。

 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 ];
[
'class' => 'yiilogFileTarget',
'prefix' => function ($message) {
  $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
  $userID = $user ? $user->getId(false) : '-';
  return "[$userID]";
}
]
 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 }

小心:日志组件必须在bootstrap中安顿,这样工夫把日记新闻分发到对应的log target.
上面包车型地铁代码里面,四个log target注册到了[[yiilogDispatcher::targets]]里面。

   二.日志记录

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

  近来支付三个新的PHP项目,终于脱离了某框架的恶势力(在此之前被折磨的不轻),选用了人世中盛名的Yii2框架。每种项目代码的运作,日志是必备的,在开采中踩了一回Yii十六日志管理的坑,看过许多网络对Yii4日志的铺排介绍,前日计算一下Yii二对日记的管理分享给我们。

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

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

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

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

例如地点的密闭关系出错了,对应的记录都不会不奇怪工作。

    log配置通过web.php(基础模板web.php 高等模板main.php)以component方式加载到利用对象Yii::$app中。

暗许意况下,[[yiilogTarget::formatMessage()]]:会帮大家把日记新闻格式化成下边的那种格式:

    Yii::trace():记录一条音信去追踪1段代码是如何运行的。那关键在支付的时候利用。 
    Yii::info():记录一条音讯来传达一些一蹴而就的新闻。 
    Yii::warning():记录1个警戒新闻用来提示一些一度发出的竟然。 
    Yii::error():记录三个沉重的荒唐,那些错误应该及早被检查。

[
'class' => 'yiilogFileTarget',
'logVars' => ['_SERVER'],
]

 

留神:当错误的句柄捕获到HTTP的丰盛的时候,记录的日志音信会以yiiwebHttpException:ErrorCode的那种格式
记录,例如[[yiiwebNotFoundHttpException]] 就能够被记录成yiiwebHttpException:404
消息格式化 日志targets用两种格式来导出日志。比如,假若你的日志target是[[yiilogFileTarget]],那么你在你的程序中记录日志的时候,应该会找到类似于文件runtime/log/app.log 记录的如下的音讯:

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

你能够透过给[[yiilogTarget::prefix]] 属性配置三个自定义的回调函数来 自定义日志的前缀。上边包车型地铁代码就落到实处了在每条日志消息前边加上了用户的ID(ip地址,sessionId等敏感新闻因为个人隐秘被去掉了)。

     即使想要自定义日志格式前缀,能够配备回调函数(note:假使在回调中选拔了一定的类需求在文书初始用“use”关键词 引进该类)

因为清空和导出的设定,私下认可情状下你调用 Yii::trace() 也许别的的日记记录形式的时候不会在日志target下即刻看到日志音讯。那对有个别长日子运作的调控台程序是一个主题材料。可是那些标题是能够缓和的,方法入上面包车型客车代码,你要求把[[yiilogDispatcher::flushInterval|flushInterval]] 和[[yiilogTarget::exportInterval|exportInterval]] 的值都设置成一:

图片 1

动用Yii的日记框架包蕴如下步骤:

 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 }

日志 Yii提供了三个可观自定义化和高增加性的日记框架。依据使用情形的例外,你能够很轻易的对各样音信就行记录、过滤、合并,举例说文本文件,数据库文件,邮件。

  三.日志组件调用

要动用该类日志,你首先要做的时规定你要测试的代码范围。然后在每壹段代码之间你都应当要保险它们是密闭的,就像是上边那个样子:

  4.日记切分

return [
'bootstrap' => ['log'],
'components' => [
  'log' => [
    'targets' => [
      'file' => [
        'class' => 'yiilogFileTarget',
      ],
      'db' => [
        'class' => 'yiilogDbTarget',
      ],
    ],
  ],
],
];

    prefix:要是未有配备,暗许调用./vendor/yiisoft/yii2/log/Target.php

消息的trace等级 在开拓的进度在那之中,大家连年希望能够知道每一条日志新闻是根源什么地方。在Yii中你能够通过布署[[yiilogDispatcher::traceLevel|traceLevel]] 属性来兑现。配置的演示如下:

  1.率先看一下log配置:

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

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

Yii::beginProfile('block1');

// some code to be profiled

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

Yii::endProfile('block1');

提示:无需总是记录调用的库房音讯,相比耗质量。所以,你应有只在你付出的时候依然用于调节和测试的事态下利用该意义。
音信的清空和导出 就犹如下面说的,记录的音信以数组的样式保存在[[yiilogLogger|logger object]]中。为了限制这么些数组消耗过多的内存,当这些数组包罗的内容大小达到有些量的时候会被相应的target从内部存款和储蓄器中间转播移到相应的靶子(文件,数据库...)中。你能够因而设置 [[yiilogDispatcher::flushInterval|flushInterval]] 的值来决定量的轻重缓急。像上边那样:

myBenchmark只是2个标志,用于你在查占卜应日志记录的时候飞速牢固。
在beginProfile和endProfile之间是足以再嵌套的,然而必须保障科学的关闭关系,如下所示:

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

你大概感兴趣的稿子:

  • 圆满解读PHP的Yii框架中的日志作用
  • 详解PHP的Yii框架中国和东瀛记的相干安顿及利用
  • Yii2框架中国和东瀛记的施用办法分析
  • YII Framework框架教程之日志用法详解
  • Yii框架达成记录日志到自定义文件的章程
  • yii框架配置暗中认可controller和action示例
  • PHP的Yii框架中动用数据库的布署和SQL操作实例教程
  • Nginx配置PHP的Yii与CakePHP框架的rewrite规则示例
  • Yii框架日志记录Logging操作示例

同等的,假诺大家一直不点名[[yiilogTarget::categories|categories]],那么每一种分类的日志音信都会被拍卖。
除了那一个之外通过[[yiilogTarget::categories|categories]] 属性来安装分类的白名单外,你也足以经过 [[yiilogTarget::except|except]]属性来安装分类的黑名单。属于黑名单的归类日志新闻不会被target管理。

上边的这一个办法就算根据差异的level和类型来记录音信,不过其实它们调用的是同八个方法function($message, $category = 'application')。当中$message正是要记录的音信,$category表示的是这些日志的归属类。下边的代码表示在暗中认可的‘application'分类上面记录了一条trace类型的音讯。

提示:记录的$message能够是简约的string也足以是复杂的数组、对象。你应该依靠分裂的情况下日志记录的天职选取合适的$message类型。默许情状下,若是您记录的$message不是String,日志在导出的时候都会调用[[yiihelpersVarDumper::export()]] 方法来输出三个string类型的新闻。

提醒:上面所说的法子其实只是单例对象[[yiilogLogger|logger object]] 的[[yiilogLogger::log()|log()]]措施的简易利用,大家得以通过Yii::getLogger()方法来收获那一个单例对象。当大家记录了足足的日记消息只怕当前的利用运转结束了,日志对象将调用[yiilogDispatcher|message dispatcher]] 方法把记录的日志音讯写入到布置的目标地点。

音信过滤 就每1种log target来讲,你能够布置它的 [[yiilogTarget::levels|levels]] 和 [[yiilogTarget::categories|categories]]属性类设置它的不得了程度以及归属的分类。
[[yiilogTarget::levels|levels]]特性的应用1个数组里面包车型客车一个或许七个值,这么些数组包蕴如下值:

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

除此而外日志消息的前缀,日志的target还把1部分上下文音讯附加在了每一群的日记记录中。私下认可情形下,全局的PHP变量包括$_GET, $_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SEWranglerVE帕杰罗. 你能够由此配备 [[yiilogTarget::logVars]] 来调治日志记录的全局变量。上边包车型大巴代码表示的是只记录$_SE揽胜VE宝马X3相关的变量。

  • [[Yii::trace()]]: 记录关于某段代码运营的连锁音讯。首假设用于开辟条件。
  • [[Yii::info()]]: 在好3人置记录一些比较灵通的消息的时候利用。
  • [[Yii::warning()]]: 当有些期望之外的政工产生的时候,使用该措施。
  • [[Yii::error()]]: 当有些供给即刻消除的殊死难点发出的时候,调用此措施记录相关信息。
[
'class' => 'yiilogFileTarget',
'levels' => ['error', 'warning'],
'categories' => [
  'yiidb*',
  'yiiwebHttpException:*',
],
'except' => [
  'yiiwebHttpException:404',
],
]

地方的代码需求你在陈设文件之中有3个底下的布局:

创办一个新的target 首先,创制3个新的日志target是很简短的。你根本做的专门的职业是贯彻[[yiilogTarget::export()]] 方法并且把数组类型的消息[[yiilogTarget::messages]]发送到钦赐的蕴藏媒介上去就行了。在这些进度中您能够调用[[yiilogTarget::formatMessage()]] 方法来格式化每一条日志音信。至于越来越多的细节你能够在Yiid的发行版本里找到详细的音讯。

首先个筛选出荒谬和警示音讯并且把那个音讯保存到了数据库。
首个筛选出分类以yiidb*初叶的错误新闻,并把那么些音讯透过邮件发送到admin@example.com 和 developer@example.com.
Yii有上面这个内置的log targets,你能够参考API文档来学学习用具体怎么去安顿和平运动用它们。

只顾:在接纳运营甘休的时候也会刷新内部存款和储蓄器,那样职业为了让日志的target能够记录完整的音信。
把日记新闻从内部存款和储蓄器刷到相应存放的地点的这一动作不是当时发出的。事实上,和方面一样,都以当内部存款和储蓄器中的日志大小到达自然程度才会发生。你能够像下边包车型大巴言传身教一样通过布置差别target的[[yiilogTarget::exportInterval|exportInterval]]值,来落成修改的目标:

注意:如此频仍的清空和导出日志新闻会下降系统的质量。
切换日志的targets 您能够经过设置[[yiilogTarget::enabled|enabled]] 属性来禁止日志的target。就如同上边包车型地铁代码描述的一模2样:

log targets 一个log target是[[yiilogTarget]]要么其子类的实例。它依照严重的等第和分类类过滤日志,然后把日记导出到特出的媒婆上边去。就举例,多少个[[yiilogDbTarget|database target]] 对象就能够把过滤之后的日记音信导出到相应数据库。
你能够在运用的配置文件中的日志组件处登记七个log targets,就如下边那样:

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

Yii::$app->log->targets['file']->enabled = false;
  • 在主应用的陈设文件(例如basic上面包车型大巴web.php)中安顿好日志的过滤和导出的设置
  • 反省差异处境下通过过滤之后的日记音讯
  • 笔录日志
2014-10-04 18:10:15 [::1][][-][trace][yiibaseModule::getModule] Loading module: debug

接下去,大家就来看看科学普及的log target具有的效能。

为了更加好的组织管理及筛选日志音信,常常意况下相应为每壹种日志分合营适的项目。你能够挑选一种有分明等级分别意思的归类,用以方便依据不相同的目的来筛选分化分类的日志。一种简易且实用的命超形式就是应用PHP的魔术常量METHOD来作为分类的称谓。Yii框架之中的主干代码在做日志记录的时候便是如此干的。举个例子说:

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

属性测验评定 属性测验评定是1种比较特其他日志记录。它一般用来获取有些模块实施时间的多寡,以此来找到品质的难题所在。比方说,[[yiidbCommand]] 这一个类就用品质测验评定日志来获得每一条sql查询所开销的时日。

  • error:对应[[Yii::error()]]记录的音信
  • warning:对应[[Yii::warning()]]笔录的新闻
  • info :对应 [[Yii::info()]]笔录的新闻
  • trace:对应 [[Yii::trace()]]记录的音信.
  • profile :对应[[Yii::beginProfile()]] 和 [[Yii::endProfile()]]记录的新闻,那种方法下边越多详细新闻会被记录。
return [
'bootstrap' => ['log'],
'components' => [
  'log' => [
    'flushInterval' => 100,  // default is 1000
    'targets' => [...],
  ],
],
];
  • [[yiilogDbTarget]]:把日志消息保存到数据库。
  • [[yiilogEmailTarget]]: 把日志新闻发送到钦定的邮箱,上边包车型大巴例证就是。
  • [[yiilogFileTarget]]: 把日记写到到文件。
  • [[yiilogSyslogTarget]]: 调用PHP的syslog()方法将日志写入到系统日志。

上面包车型大巴安插钦赐了二个分拣相配yiidb*或者 yiiwebHttpException:*,但又不包蕴yiiwebHttpException:40肆的归类,而且它只管理错误和警告的日志新闻。

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

调用日志记录的情势

下面的示范在YII_DEBUG为true的时候将[[yiilogDispatcher::traceLevel|traceLevel]] 设置为叁,反之设置为0. 意味是怎么吧?三意味着每一条日志记录都会记录与之毛将焉附唇揭齿寒的三层栈调用消息,0表示不记录任何有关的栈调用消息

[[yiilogTarget::categories|categories]] 属性的值是数组,那一个数组里面包车型客车值能够是二个具体的归类名称,也能够是接近正则的合作形式。唯有在target能在那一个数组里面找到相应的归类名或然符合某贰个金童玉女方式,他才会管理这么些音讯。这里的同盟情势的重组是在分拣的名目前面加上贰个号。借使这几个分类恰好和这一个相称情势的号前的字符匹配,那么也正是其1分类找到对应相配值。举个例来讲,在类[[yiidbCommand]]中的yiidbCommand::execute和yii dbCommand:: query 方法运用类名类记录相关日志新闻,那么这年她们都同盟情势yiidb*

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',
        ],
      ],
    ],
  ],
],
];
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:日志处理,PHP的Yii框架的常用日志操作总结