菜鸟常忽略的基础 - 日志消息

  • 作者: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::errorYii::warningYii::infoYii::debug等这些方法其实底层都调用了同一个方法记录了不同级别的消息