若想看本文的视频教程,可关注我的微信公众号,搜索历史文章查看:
1、概述
本文主要介绍如何实现Yii的日志配置,主要包括如下内容:
- 基础配置
- 记录日志到文件
- 把严重的错误日志自动发送到邮箱
- 解决明明写日志了,但是日志文件中没有记录的问题
- 解决日志文件数量达到上限后,日志记录阻塞严重的问题
2、基础配置
在记录日志的时候,我们要考虑如下几个方面的内容:
- 日志文件存放到哪里
- 日志文件的命名规则
- 日志文件的大小限制
- 日志文件的内容格式
请参考如下配置:
return [
// 必须在引导期间加载“log”组件
'bootstrap' => ['log'],
// “log”组件处理带时间戳的消息。 设置 PHP 时区以创建正确的时间戳
'timeZone' => 'PRC',
'components' => [
'log' => [
'flushInterval' => 1,
'traceLevel' => 0,//YII_DEBUG ? 3 : 0,
'targets' => [
[
//logVars 为空,可以减少输出不必要的信息
'logVars' => [],
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'levels' => ['info','error'],
'categories' => ['test'],
//日志文件存放路径和文件名,以天为文件名可以减少日志文件的大小
'logFile' => '@backend/runtime/logs/test/'.date("Y-m-d").'.log',
'maxFileSize' => 1024 * 100, //每个日志文件最大100M
'maxLogFiles' => 100,//最大的文件数量
'prefix' => function() { //日志格式自定义 回调方法
return "";
},
],
]
],
],
];
注意:如果在出发日志记录功能的时候,没有在目标日志文件看到记录,那么请设置以下这两个值:
'flushInterval' => 1
'exportInterval' => 1
因为Yii会在日志栈中积累到一定数量的时候才会把日志写到日志文件中,因此我们需要把上述两个配置项都设置为1,表示立刻输出到日志文件。
3、记录日志到文件
Yii::info("Hello World!", "test"); //此处的"test"是指categories配置
上述语句可以把Hello World!
输入到日志文件中,得到的结果如下:
2021-07-18 08:53:50 [info][test] Hello World!
由于我们也定义了error
的日志类型('levels' => ['info','error']
),因此也可以这么做:
Yii::error("Hello World!", "test");
日志文件记录如下:
2021-07-18 17:11:58 [error][test] Hello World!
4、记录日志代码信息
如果想知道日志文件中的日志是从哪个文件的哪行代码打印的,可以设置这个参数'traceLevel' => 3
,可以得到如下的效果:
2021-07-18 08:52:59 [info][test] Hello World!
in /app/backend/controllers/SiteController.php:104
5、发送到邮件
如果我们遇到致命性质的bug报错,需要把错误日志第一时间发送给运维人员,此时就需要用到日志的发邮件功能给,配置如下:
return [
// 必须在引导期间加载“log”组件
'bootstrap' => ['log'],
// “log”组件处理带时间戳的消息。 设置 PHP 时区以创建正确的时间戳
'timeZone' => 'PRC',
'components' => [
'log' => [
'flushInterval' => 1,
'traceLevel' => 0,//YII_DEBUG ? 3 : 0,
'targets' => [
[
'logVars' => [],
'class' => 'yii\log\EmailTarget',
'levels' => ['error','info'],
'categories' => ['mail'],
'message' => [
'from' => ['chenzhiweiwk@sina.com'],
'to' => ['chenzhiweiwk@sina.com'],
'subject' => ucfirst(YII_ENV).' Exception',
],
],
]
],
],
];
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCrQb1dt-1626601235444)(.assets/img/image-20210718173043220.png)]
6、写日志阻塞的问题
我曾经遇到一个问题,当日志文件达到100个上限后,再往日志里记录消息时,整个系统阻塞严重,原因是Yii会处理这100个文件,把老数据删除,然后记录新数据,由于每个文件都很大,因此要花费很长的时间。
解决方法:
我们动态指定日志文件,比如说以日期为文件名,这样的话YII就会新的文件名执行规则,可以避免这个问题。