日志和使用上下文信息
有时,一个错误信息不足以修复一个错误。例如,如果你使用最佳实践,并且使用所有可能的错误来开发和测试一个应用,你可以得到一个错误信息。但是,没有执行的上下文,它只是告诉你这里有一个错误,并不清楚究竟是什么导致的。
在我们的例子中,我们将会使用一个非常简单并且代码编写很烂的动作,它会输出Hello <username>!,其中username直接从$_GET中获取。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
如何做…
执行如下步骤:
- 首先,我们需要一个控制器。因此,创建
protected/controllers/LogController.php:
<?phpnamespace app\controllers;use yii\web\Controller;class LogController extends Controller{public function actionIndex(){return 'Hello, ' . $_GET['username'];}}
- 现在,如果我们运行index动作,我们将会得到一个错误信息,
Undefined index: username。配置logger将这样的错误写入到文件:
config/web.php
'components'=>[...'log' => ['targets' => [['class' => 'yii\log\FileTarget','levels' => ['error'],'logFile' => '@runtime/logs/errors.log',],],],],
- 在次运行index动作,并检查
runtime/logs/errors.log。将会有如下日志信息:
2016-03-06 09:27:09 [127.0.0.1][-][-][error][yii\base\ErrorException:8] exception 'yii\base\ErrorException' withmessage 'Undefined index: username' in /controllers/LogController.php:11Stack 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]
- 现在我们可以将我们的应用给一个测试组并不时的检查错误日志。默认情况下,错误报告日志包含了
$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_SERVER变量中的所有的值。如果你不希望展示所有的值,你可以指定一个自定义的变量列表:
'log' => ['targets' => [['class' => 'yii\log\FileTarget','levels' => ['error'],'logVars' => ['_GET', '_POST'],'logFile' => '@runtime/logs/errors.log',],],],
- 在这个例子中,报告只包含
$_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变量的内容打到日志中,如果这两个变量不为空的话。
参考
- 欲了解更多关于日志过滤器和上下文信息,参考http://www.yiiframework.com/doc-2.0/guide-runtime-logging.html
- 使用不同的日志路由小节
