Yii2 Logger 理解 & 使用建议

≯℡__Kan透↙ 提交于 2020-03-12 16:28:57

理解

组成

Yii2的logger主要分为三个部分:

  • Logger 负责日志级别,记录格式等等的配置和管理;
  • Dispatcher 负责日志的收集和对target的管理;
  • target 负责执行写入的操作,可以是写文件,写数据库等等。

流程

配置

  1. log组件放入bootstrap配置中,用于初始化启动

  2. components中配置log的日志消费处理类(若日志分类详细记录较多可单独抽出文件)

配置详解

  • log
    • flushInterval //日志积累数量,积累到达该数量后才会执行flush
    • traceLevel //  消息跟踪级别,例如YII_DEBUG ? 3 : 0,若YII_DEBUG开启将被追加最多3个调用堆栈层级
    • targets(这里可以有key,这样可以通过Yii::$app->log->targets[key]->enabled = false;单独关闭某个日志记录)
      • class// 通过什么方式存储 DbTarget/FileTarget/EmailTarget/SyslogTarget
      • levels// 存放的错误级别
      • prefix// 一个可调用的函数,它返回一个字符串,为每个导出的消息添加前缀
      • logFile// FileTarget-日志存放路径
      • categories// 白名单分类
      • except// 黑名单分类
      • logVars// 指定记录参数,不指定则记录全部 GET POST FILES COOKIE SESSION SERVER参数,'logVars' => ['*'],则只记录message
      • enableRotation// 是否允许切割日志
      • rotateBycopy// 通过复制切割,否则通过重命名切割
      • maxFileSize// 最大文件大小 - 单位是kb!!!!(php的filesize 单位是byte)
      • maxLogFiles// 最大文件数
      • fileMode //设置文件权限0755
      • exportInterval //消息达到该数量后执行export
      • message // 邮件
        • from // 发件人
        • to // 收件人
        • subject // 主题

启动

  1. yii框架实例化组件log,coreComponents方法默认指定log对应yii\log\Dispatcher类
  2. Dispatcher类实例化,__construct方法根据配置设置静态常量logger,然后调用父类的__construct方法(即Object的)将参数设置为实例的属性,如果配置没有配置logger,则设置成默认的yii\log\Logger类
  3. 然后Dispatcher类再调用init方法,将配置中的targets里的日志消费处理类实例化
  4. 至此,log类已经启动完成,打印信息如下

生产消费

  1. 调用Yii::trace、Yii::error、Yii::info、Yii::warning产生日志,第一个参数为message,第二个参数是category

  2. 框架读取静态常量logger,来调用log方法

  3. log方法根据一定条件触发flush方法,保存的信息数量达到$this->flushInterval((默认值为1000)属性值时,执行flush方法触发日志消费类来消费日志数据

  4. flush方法中读取dispatcher实例,调用dispatcher方法,将日志数据路由

调用yii\db\Dispatcher的dispatch方法,并传递信息数组$this->messages,和$final参数,$final为true表示脚本已执行结束,不管messages已经多少条都会写入

public function flush($final = false) {
	if ($this->dispatcher instanceof Dispatcher) { 
		$this->dispatcher->dispatch($this->messages, $final);
	}
	$this->messages = [];
}
  1. dispatcher方法循环遍历配置中的日志消费类实例,调用collect方法来收集日志数据

  2. collect方法根据配置中设置的levels来过滤日志,最后调用export方法将日志消费并存储(四种日志消费类的export抽象方法,DbTarget/FileTarget/EmailTarget/SyslogTarget)

使用建议

  1. 生产环境 enableRotation 设置false,日志放在/data/app/logs下面,运维会进行切割,php的切割比较坑,会降低性能。

  2. flushInterval,exportInterval配合使用,若需要立即看到消息,则都设置为1即可

其他

yii2-log支持按时间来保存日志

'components' => [
     ...
     'log' => [
         'traceLevel' => YII_DEBUG ? 3 : 0,
         'targets' => [
             [
                 'class' => 'yii\log\FileTarget',
                 'levels' => ['error', 'warning','info','trace','profile'],
                 'logVars'=>[],
                 //表示以yii\db\或者app\models\开头的分类都会写入这个文件
                 'categories'=>['yii\db\*','app\models\*'],
                 //表示写入到文件sql.log.2014xxxx
                 'logFile'=>'@runtime/logs/sql.log.'.date('Ymd'),
             ],
         ],
     ],
 ],

Yii2切割日志的方法很垃圾,建议不要使用

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!