日志和使用上下文信息
有时,一个错误信息不足以修复一个错误。例如,如果你使用最佳实践,并且使用所有可能的错误来开发和测试一个应用,你可以得到一个错误信息。但是,没有执行的上下文,它只是告诉你这里有一个错误,并不清楚究竟是什么导致的。
在我们的例子中,我们将会使用一个非常简单并且代码编写很烂的动作,它会输出Hello <username>!
,其中username
直接从$_GET
中获取。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
如何做…
执行如下步骤:
- 首先,我们需要一个控制器。因此,创建
protected/controllers/LogController.php
:
<?php
namespace 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' 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
]
- 现在我们可以将我们的应用给一个测试组并不时的检查错误日志。默认情况下,错误报告日志包含了
$_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
- 使用不同的日志路由小节