在 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');
近期评论