17. Yii 2.0 log组件

来源:互联网 发布:2016年网络炒作事件 编辑:程序博客网 时间:2024/06/05 14:47
log组件主要用于记录程序运行过程中产生的异常(或错误)或 操作日志。

这里以 Yii 2.0 基础版为例,高级版类似。
Yii 封装的日志类文件位于 /vendor/yiisoft/yii2/log 目录下。
log组件支持的日志介质主要有 DbTarget.php、FileTarget.php、EmailTarget.php和SyslogTarget.php。
这里我们主要介绍前三种,即数据库日志、文件日志和邮件日志。

记录日志的级别,主要有以下几种:
self::LEVEL_ERROR => 'error',      // 不可恢复的异常信息
self::LEVEL_WARNING => 'warning',   // 程序运行时的警告信息
self::LEVEL_INFO => 'info',    // 程序运行时的信息,如:管理员操作
self::LEVEL_TRACE => 'trace',    // 调试信息,需要开启 YII_DEBUG 调试模式
self::LEVEL_PROFILE_BEGIN => 'profile begin',
self::LEVEL_PROFILE_END => 'profile end',

1. 文件日志
文件日志的默认保存位置为 /basic/runtime/logs

首先,查看web配置文件 /basic/config/web.php 中的组件配置,可看到日志组件的默认配置如下:
 1 2 3 4 5 6 7 8 9
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0, // trace级别
'targets' => [
[
'class' => 'yii\log\FileTarget', // 默认采用文件日志
'levels' => ['error', 'warning'], // 记录日志的级别,记录异常和警告
],
],
],
 来自CODE的代码片
snippet_file_0.php
其次,在控制器层添加一个控制器文件 LogController.php,进行测试,代码如下:
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21
<?php
namespace app\controllers;
use yii\web\Controller;
class LogController extends Controller {
/**
* 测试主动记录日志
*/
public function actionTest() {
// 这里是人为的调用方法来记录日志,其实当程序运行中出现异常时,会自动记录error日志。
\Yii::warning('这是一个警告'); // 记录日志的各个方法都没有返回值
\Yii::error('这是一个错误', 'app'); // 第二个参数可以指定 category 分类,默认值为 application
\Yii::info ( '修改密码', 'operation' ); // 如果想记录info级别的日志,log组件的日志级别需要包含info才行
\Yii::trace('这是一个trace信息');
}
}
 来自CODE的代码片
snippet_file_0.php
最后,在浏览器中访问 http://basic.com/log/test,就可以看到 /basic/runtime/logs 中的日志文件了。

2. 数据库日志
首先,需要按照 /basic/vendor/yiisoft/yii2/log/migrations/schema-mysql.sql 文件中给出的sql语句,在数据库中创建一个 log 数据表(如果需要表前缀,请自行加上)。

其次,修改web配置文件 /basic/config/web.php 中的组件配置中的log组件,将 'class' => 'yii\log\FileTarget' 改为 'class' => 'yii\log\DbTarget' 即可。

最后,在浏览器中访问 http://basic.com/log/test,就可以在 数据表 log 中看到对应的日志记录了。

3. 邮件日志
使用邮件日志介质,除了要修改log组件外,还必须配置mailer组件。配置方法可参考下面的部分代码。

4. Dispatcher调度器的使用
Dispatcher调度器,又称分配器,利用它的日志组件配置格式,可以将不同级别的日志分配给不同的日志介质来处理,也可以将同一级别的日志分配给多个日志介质处理。

Dispatcher调度器的类文件为/basic/vendor/yiisoft/yii2/log/Dispatcher.php

首先,修改web配置文件 /basic/config/web.php 中的组件配置中的log组件的配置,代码如下:
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
'log' => [
'targets' => [
'file' => [ // 只匹配日志级别levels
'class' => 'yii\log\FileTarget',
'levels' => [
'trace',
'warning'
],
],
'db' => [ // 同时匹配日志级别levels和分类categories
'class' => 'yii\log\DbTarget',
'levels' => [
'info'
],
'categories' => [
'yii\*' ,
'operation'
]
],
'email' => [
'class' => 'yii\log\EmailTarget',
'levels' => [
'error',
'warning'
],
'message' => [
'from'=>'junjie.3533@163.com', // 发件人,可采用数组格式
'to' => '******@qq.com', // 收件人,可采用数组格式,发送到多个邮箱
'subject' => 'Yii 2.0 Log', // 邮件主题
]
]
]
],
 来自CODE的代码片
snippet_file_0.txt
其次,由于我们使用了邮件日志介质,故我们还必须修改组件配置中的mailer组件的配置,代码如下:
  1  2  3  4  5  6  7  8  9 10 11 12
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false, // 是否只将邮件日志保存为文件,false表示否,即将邮件日志发送出去
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.163.com', // 邮件服务器地址,邮箱账号需开通对应的服务(如:smtp服务)
'username' => 'junjie.3533', // 邮箱账号
'password' => '******', // 邮箱密码,如果开启了授权码登录第三方邮件客户端,则用授权码
'port' => '25', // 端口
'encryption' => 'tls'
]
],
 来自CODE的代码片
snippet_file_0.php
最后,在浏览器中访问 http://basic.com/log/test ,测试对应的效果。