理解
组成
Yii2的logger主要分为三个部分:
- Logger 负责日志级别,记录格式等等的配置和管理;
- Dispatcher 负责日志的收集和对target的管理;
- target 负责执行写入的操作,可以是写文件,写数据库等等。
流程
配置
-
log组件放入bootstrap配置中,用于初始化启动
-
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 // 主题
启动
- yii框架实例化组件log,coreComponents方法默认指定log对应yii\log\Dispatcher类
- Dispatcher类实例化,__construct方法根据配置设置静态常量logger,然后调用父类的__construct方法(即Object的)将参数设置为实例的属性,如果配置没有配置logger,则设置成默认的yii\log\Logger类
- 然后Dispatcher类再调用init方法,将配置中的targets里的日志消费处理类实例化
- 至此,log类已经启动完成,打印信息如下
生产消费
-
调用Yii::trace、Yii::error、Yii::info、Yii::warning产生日志,第一个参数为message,第二个参数是category
-
框架读取静态常量logger,来调用log方法
-
log方法根据一定条件触发flush方法,保存的信息数量达到$this->flushInterval((默认值为1000)属性值时,执行flush方法触发日志消费类来消费日志数据
-
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 = [];
}
-
dispatcher方法循环遍历配置中的日志消费类实例,调用collect方法来收集日志数据
-
collect方法根据配置中设置的levels来过滤日志,最后调用export方法将日志消费并存储(四种日志消费类的export抽象方法,DbTarget/FileTarget/EmailTarget/SyslogTarget)
使用建议
-
生产环境 enableRotation 设置false,日志放在/data/app/logs下面,运维会进行切割,php的切割比较坑,会降低性能。
-
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切割日志的方法很垃圾,建议不要使用
来源:oschina
链接:https://my.oschina.net/wsyblog/blog/3192560