菜鸟常忽略的基础 - 日志消息 ¶
本文导航
作者:KK
发表日期:2016.9.12
咱们都知道在Yii2里要做日志的话,可以调用Yii::error('日志内容')
,通过配置log组件后,就可以在@runtime/logs目录看到日志文件和内容了
其实执行Yii::error的时候并不是马上进行写日志的,而是先把日志信息保存到Yii::getLogger()->messages
这个数组里(以后我们就叫它消息列表吧),随着程序运行到不同的周期我们打印这个数组,可以看到它在不断地追加内容
在程序结束后才统一将这些消息进行写日志
不管是否收集都会追加消息 ¶
在日志配置里一般是这样的:
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'], //重点在这里
'logFile' => '@runtime/logs/app.log',
],
],
],
其中levels指定了要收集的日志级别,在Yii里定义了以下7个日志级别:
use yii\log\Logger;
print_r([
'Logger::LEVEL_ERROR 错误级别' => Logger::LEVEL_ERROR,
'Logger::LEVEL_WARNING 警告级别' => Logger::LEVEL_WARNING,
'Logger::LEVEL_INFO 信息级别' => Logger::LEVEL_INFO,
'Logger::LEVEL_TRACE 追踪级别' => Logger::LEVEL_TRACE,
'Logger::LEVEL_PROFILE 性能分析级别' => Logger::LEVEL_PROFILE,
'Logger::LEVEL_PROFILE_BEGIN 开始性能分析级别' => Logger::LEVEL_PROFILE_BEGIN,
'Logger::LEVEL_PROFILE_END 结束性能分析级别' => Logger::LEVEL_PROFILE_END,
]);
所以我们也可以在levels里面设定要收集以上7种日志级别,但是就算我们不收集以上级别,甚至连log组件都不定义,然而运行过程中Yii::getLogger()->messages
依然有各种不同级别的消息
因为Yii是在运行结束后统一做消息分发的(我个人的说法),在逐一分发每条消息的时候看看log组件的targets配置有没有Target要收集这个消息,有就分配给这个Target去处理,没有就算了,再分发下一条消息
消息结构 ¶
Yii::getLogger()->messages
里的每一条消息的第一级元素都是相同的,从yii\log\Logger::log
方法中可以看到这么一句代码:
$this->messages[] = [$message, $level, $category, $time, $traces];
由此可以解读到日志消息元素的结构为一个索引数组,元素结构是:[日志内容, 日志级别, 日志分类, 发生时间, 回溯]
而Yii::error
、Yii::warning
、Yii::info
、Yii::debug
等这些方法其实底层都调用了同一个方法记录了不同级别的消息