View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

日志和使用上下文信息

有时,一个错误信息不足以修复一个错误。例如,如果你使用最佳实践,并且使用所有可能的错误来开发和测试一个应用,你可以得到一个错误信息。但是,没有执行的上下文,它只是告诉你这里有一个错误,并不清楚究竟是什么导致的。

在我们的例子中,我们将会使用一个非常简单并且代码编写很烂的动作,它会输出Hello <username>!,其中username直接从$_GET中获取。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。

如何做…

执行如下步骤:

  1. 首先,我们需要一个控制器。因此,创建protected/controllers/LogController.php
<?php
namespace app\controllers;
use yii\web\Controller;
class LogController extends Controller
{
    public function actionIndex()
    {
        return 'Hello, ' . $_GET['username'];
    }
}
  1. 现在,如果我们运行index动作,我们将会得到一个错误信息,Undefined index: username。配置logger将这样的错误写入到文件:
config/web.php
'components'=>[
    ...
    'log' => [
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['error'],
                'logFile' => '@runtime/logs/errors.log',
            ],
        ],
    ],
],
  1. 在次运行index动作,并检查runtime/logs/errors.log。将会有如下日志信息:
2016-03-06 09:27:09 [127.0.0.1][-][-][error][yii\base\
ErrorException:8] exception 'yii\base\ErrorException' with
message 'Undefined index: username' in /controllers/
LogController.php:11
Stack trace:
#0 /yii2/base/InlineAction.php(55): ::call_user_func_array()
#1 /yii2/base/Controller.php(151): yii\base\
InlineAction->runWithParams()
#2 /yii2/base/Module.php(455): yii\base\Controller->runAction()
#3 /yii2/web/Application.php(84): yii\base\Module->runAction()
#4 /yii2/base/Application.php(375): yii\web\
Application->handleRequest()
#5 /web/index.php(12): yii\base\Application->run()
#6 {main}
2016-03-06 09:27:09 [127.0.0.1][-][-][info][application] $_GET
= [
    'r' => 'log/index'
]
$_COOKIE = [
    '_csrf' => 'ca689043348e...a69ea:2:{i:0;s:...\"DSS...KJ\";}'
    'PHPSESSID' => '30584oqhat4ek8b0hrqsapsbf4'
]
$_SERVER = [
    'USER' => 'www-data'
    'HOME' => '/var/www'
    'FCGI_ROLE' => 'RESPONDER'
    'QUERY_STRING' => 'r=log/index'
    ...
    'PHP_SELF' => '/index.php'
    'REQUEST_TIME_FLOAT' => 1459934829.3067
    'REQUEST_TIME' => 1459934829
]
  1. 现在我们可以将我们的应用给一个测试组并不时的检查错误日志。默认情况下,错误报告日志包含了$_GET$_POST$_FILES$_COOKIE$_SESSION$_SERVER变量中的所有的值。如果你不希望展示所有的值,你可以指定一个自定义的变量列表:
'log' => [
    'targets' => [
        [
        'class' => 'yii\log\FileTarget',
        'levels' => ['error'],
        'logVars' => ['_GET', '_POST'],
        'logFile' => '@runtime/logs/errors.log',
        ],
    ],
],
  1. 在这个例子中,报告只包含$_GET$_POST两个数组:
...
2016-04-06 09:49:08 [127.0.0.1][-][-][info][application] $_GET
= [ 'r' => 'log/index' ]

工作原理…

Yii在打印错误日志信息时,添加了执行上下文和环境的完整信息。如果我们手动打一个日志消息,我们可能知道我们需要的信息,所以我们可以设置一些目标选项来我们真正需要的东西:

'log' => [
    'targets' => [
        [
        'class' => 'yii\log\FileTarget',
        'levels' => ['error'],
        'logVars' => ['_GET', '_POST'],
        'logFile' => '@runtime/logs/errors.log',
        ],
    ],
],

先前的代码会将错误日志写到一个名叫errors的文件中,此外对于消息本身,它会将$_GET$_POST变量的内容打到日志中,如果这两个变量不为空的话。

参考