本文实例讲述了YII2框架中日志的配置与使用方法。分享给大家供大家参考,具体如下:
YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用。
我们在config/web.php中配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
return [ //log必须在bootstrap期间就被加载,便于及时调度日志消息到目标 'bootstrap' => [ 'log' ], 'components' => [ 'log' => [ //消息跟踪级别,设置yii\log\Dispatcher::traceLevel属性 //YII_DEBUG开启时,日志消息被记录时,追加最多3个调用堆栈信息 'traceLevel' => YII_DEBUG ? 3 : 0, //日志目标,可定义多个 'targets' => [ [ //日志处理器类 'class' => 'yii\log\FileTarget' , //日志记录的级别 'levels' => [ 'error' , 'warning' ], //定义日志文件 'logFile' => '@runtime/logs/test.log' , ], ], ], ], ]; |
通过下面5个方法,来写入我们自已的日志
1
2
3
4
5
6
7
8
9
10
|
//跟踪 Yii::trace( '我是一条跟踪' ); //消息 YII::info( '我是一条消息' ); //调试 YII::debug( '我是一条调试' ); //警告 YII::warning( '我是一条警告' ); //错误 YII::error( '我是一条错误' ); |
注意我们上面定义日志的levels为['error', 'warning'],所以日志只会记录这两个级别的信息。
有些时候我们并不希望把所有日志写在一起,我们会根据不同模块来写日志,这样以便区分,这就需要用到日志的分类了。
重新配置config/web.php如下:
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
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ //日志处理器类,这里我改用数据库存日志了 'class' => 'yii\log\DbTarget' , //日志记录的级别 'levels' => [ 'error' , 'warning' ], //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。 'logVars' => [], //定义分类 'categories' => [ 'db' ], ], [ //日志处理器类,这里我改用数据库存日志了 'class' => 'yii\log\DbTarget' , //日志记录的级别 'levels' => [ 'error' , 'warning' ], //追加上下文信息,默认YII会包含PHP全局变量,这里我们不需要,设为空。 'logVars' => [], //定义分类 'categories' => [ 'pay' ], ], ], ], |
通过如下方法,添加我们的日志
1
2
3
4
5
6
7
8
9
|
//警告 YII::warning( '我是一条数据库警告' , 'db' ); //错误 YII::error( '我是一条数据库错误' , 'db' ); //警告 YII::warning( '我是一条支付警告' , 'pay' ); //错误 YII::error( '我是一条支付错误' , 'pay' ); |
由于上面的配置我们使用了DbTarget,我们还需要添加一张日志表,用于记录我们的日志,进入项目目录。运行如下命令:
1
|
yii migrate --migrationPath=@yii/log/migrations |
当然categories我们也可以指定为YII的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget' , 'levels' => [ 'error' , 'warning' ], ], [ //日志处理器类,这里我改用数据库存日志了 'class' => 'yii\log\DbTarget' , //日志记录的级别,这里演示设为info 'levels' => [ 'info' ], //定义分类 'categories' => [ 'yii\db\*' ], ], ], ], |
然后我们操作一下数据库,看是否日志记录了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php namespace app\controllers; use YII; use yii\db\Query; use yii\web\Controller; class TestController extends Controller { public function actionTest() { $data = ( new Query())->from( '{{%user}}' ) ->where( 'id=:id' , [ ':id' => '1' ]) ->all(); var_dump( $data ); } } |
日志消息的格式化,我们可以自定义日志的前缀。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget' , 'levels' => [ 'error' , 'warning' ], ], [ //日志处理器类,这里我改用数据库存日志了 'class' => 'yii\log\DbTarget' , 'levels' => [ 'error' , 'warning' ], //定义分类 'categories' => [ 'db' ], //定义前缀 'prefix' => function ( $message ) { $uid = ! empty (YII:: $app ->user->id) ? YII:: $app ->user->id : '-' ; $mid = ! empty (YII:: $app ->module->id) ? YII:: $app ->module->id : '-' ; $cid = ! empty (YII:: $app ->controller->id) ? YII:: $app ->controller->id : '-' ; $aid = ! empty (YII:: $app ->controller->action->id) ? YII:: $app ->controller->action->id : '-' ; return "[{$uid}][{$mid}/{$cid}/{$aid}]" ; }, ], ], ], |
使用如下代码,记录日志,查看效果
1
2
|
YII::warning( '我是警告!!!' , 'db' ); YII::error( '我是错误!!!' , 'db' ); |
由于没有登陆和分模块,所以没获取到用户ID和模块ID,不过控制器ID和方法ID都获取到了。
消息的刷新和导出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, //消息被存放在一个数组里,积累到一定数量,才会被刷新到日志target //通过flushInterval设置消息刷新到日志target的数量 'flushInterval' => 100, 'targets' => [ [ 'class' => 'yii\log\FileTarget' , 'levels' => [ 'error' , 'warning' ], ], [ //日志处理器类,这里我改用数据库存日志了 'class' => 'yii\log\DbTarget' , //当消息刷新到日志对象时,并不会立即导出,只有累积到一定数量才会导出 //通过exportInterval来设置这个导出数量 'exportInterval' => 100, 'levels' => [ 'error' , 'warning' ], //定义分类 'categories' => [ 'db' ], ], ], ], |
有人会问YII2设置flushInterval和exportInterval的作用是什么,因为在一些系统中日志的操作会很频繁,如果频繁的读取文件或数据库来写日志,会造成严重的IO消耗,降低系统性能,这也是YII2的一个优化吧。
当然有些时候一些长时间在控制台运行的程序,需要立即显示日志,那么可以通过如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'flushInterval' => 1, 'targets' => [ [ 'class' => 'yii\log\FileTarget' , 'levels' => [ 'error' , 'warning' ], ], [ 'class' => 'yii\log\FileTarget' , 'exportInterval' => 1, 'levels' => [ 'error' , 'warning' ], //定义分类 'categories' => [ 'db' ], ], ], ], |
将flushInterval和exportInterval分别设为1。
有些时候我们需要人为的开启和关闭某些日志目标,这时就需要我们为每个日志目标设个键,以区分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ 'pay' => [ 'class' => 'yii\log\DbTarget' , 'levels' => [ 'error' , 'warning' ], 'categories' => [ 'pay' ], ], 'db' => [ 'class' => 'yii\log\DbTarget' , 'levels' => [ 'error' , 'warning' ], 'categories' => [ 'db' ], ], ], ], |
然后通过如下,进行开启和关闭:
1
2
3
4
|
//关闭 Yii:: $app ->log->targets[ 'db' ]->enabled = false; //开启 Yii:: $app ->log->targets[ 'db' ]->enabled = true; |
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
原文链接:https://www.cnblogs.com/jkko123/p/8692376.html