在 Yii2 中的 Debug Log Messages 中,error 日志显示为 json 格式,可读性太差的排查分析
1、在 Yii2 中的 Debug Log Messages 中,error 日志显示为 json 格式,可读性太差的排查分析。如图1
2、发现现有的实现大致如下
api/config/main.php
return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
'class' => api\exception\ApiErrorHandler::class,
],
]
];
api/exception/ApiErrorHandler.php
<?php
namespace api\exception;
use Yii;
use yii\web\ErrorHandler;
use yii\web\Response;
use yii\web\UnauthorizedHttpException;
class ApiErrorHandler extends ErrorHandler
{
protected function renderException($exception)
{
if (Yii::$app->has('response')) {
$response = Yii::$app->getResponse();
// reset parameters of response to avoid interference with partially created response data
// in case the error occurred while sending the response.
$response->isSent = false;
$response->stream = null;
$response->data = null;
$response->content = null;
} else {
$response = new Response();
}
$response->format === Response::FORMAT_JSON;
$code = 10090;
$message = '系统错误';
if ($exception instanceof UnauthorizedHttpException) {
$message = '登录后才可访问';
$code = 11000;
} else {
Yii::error(['异常捕获', $exception->getMessage(), $exception->getFile(), $exception->getLine()]);
Yii::error($exception->getTrace(), 'application');
}
$response->data = [
'code' => $code,
'message' => $message,
'data' => [
'error_code' => $exception->getCode()
]
];
// $response->headers->add('Access-Control-Allow-Origin', '*');
// $response->headers->add('Access-Control-Allow-Headers', '*');
$response->send();
}
}
3、error 日志是由这一行输出的 ,Yii::error($exception->getTrace(), ‘application’); ,因为 $exception->getTrace() 是一个数组,Yii 默认是把它 json_encode() 后写到日志里的,所以在 debug 模块里看到的是 JSON 格式(数组被转成了字符串)。
4、最终调整如下,error 日志中不再是 json 格式。如图2
api/exception/ApiErrorHandler.php
<?php Yii::error($exception->getTraceAsString());
5、不过发现 error application 与 error Error 是大致相似的,感觉没有必要再记录一个 $exception->getTraceAsString() 了。
6、决定调整一下 api/web/index.php 中的配置,然后再次观察生成的日志。查看 app.log ,发现仍然无甚差异,决定删除掉 Yii::error($exception->getTraceAsString()); 如图3
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');



近期评论