lizhen_gitee 4 viikkoa sitten
vanhempi
commit
f79cd03091

+ 38 - 4
app/Http/Controllers/Api/BaseController.php

@@ -1,26 +1,60 @@
 <?php
 namespace App\Http\Controllers\Api;
 use App\Http\Requests\ApiRequest;
+use App\Utils\Control\ActionUtil;
+use App\Utils\LogUtil;
 
 class BaseController
 {
     public function success($data = [],$code =200, $message = '')
     {
-        return response()->json([
+        return $this->response([
             'status'  => true,
             'code'    => $code,
             'message' => $message ?: config('errorcode.code')[$code],
             'data'    => $data,
-        ], 200, [], JSON_INVALID_UTF8_IGNORE);
+        ]);
+        /*return response()->json([
+            'status'  => true,
+            'code'    => $code,
+            'message' => $message ?: config('errorcode.code')[$code],
+            'data'    => $data,
+        ], 200, [], JSON_INVALID_UTF8_IGNORE);*/
     }
 
     public function fail($code, $data = [], $message = '')
     {
-        return response()->json([
+        return $this->response([
+            'status'  => false,
+            'code'    => $code,
+            'message' => $message ?: config('errorcode.code')[(int) $code],
+            'data'    => $data,
+        ]);
+        /*return response()->json([
             'status'  => false,
             'code'    => $code,
             'message' => $message ?: config('errorcode.code')[(int) $code],
             'data'    => $data,
-        ],200, [], JSON_INVALID_UTF8_IGNORE);
+        ],200, [], JSON_INVALID_UTF8_IGNORE);*/
+    }
+
+    /**
+     * 返回统一格式
+     * @param array $data
+     * @return \Illuminate\Http\JsonResponse
+     */
+    private function response(array $data)
+    {
+        $response = response()->json($data, 200, [], JSON_INVALID_UTF8_IGNORE);
+
+        //日志
+        $action = ActionUtil::getInstance()->get();
+        if (!empty($action)){
+            if (!empty($data['data']) && strlen(json_encode($data['data'])) > 10000){
+                $data['data'] = '数据太多,不记录';
+            }
+            LogUtil::info('响应结果', 'api', 'request',$data);
+        }
+        return $response;
     }
 }

+ 1 - 0
app/Http/Kernel.php

@@ -43,6 +43,7 @@ class Kernel extends HttpKernel
             'throttle:api',
             \Illuminate\Routing\Middleware\SubstituteBindings::class,
             //\App\Http\Middleware\ApiAuth::class,
+            \App\Http\Middleware\ApiAgent::class,
 
         ],
 

+ 48 - 0
app/Http/Middleware/ApiAgent.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Master\Enum\RedisKeyEnum;
+use App\Models\Arts\UserModel;
+use App\Utils\AppResult;
+use App\Utils\Control\ActionUtil;
+use App\Utils\Control\AuthUser;
+use App\Utils\Encrypt\Token;
+use App\Utils\LogUtil;
+use App\Utils\Encrypt\TokenUtil;
+use App\Utils\RedisUtil;
+use Closure;
+use Illuminate\Support\Facades\Cache;
+
+class ApiAgent
+{
+    const controller= 'api';
+    const action= 'request';
+    /**
+     *
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param \Closure $next
+     * @return mixed
+     * @throws \Exception
+     */
+    public function handle($request, Closure $next)
+    {
+        //日志统一写入
+        register_shutdown_function([new LogUtil, 'close']);
+        LogUtil::getInstance('Api/'); //设置日志存入通道
+
+        $path = $request->path();
+
+        //当前接口请求控制器
+        $controller = ActionUtil::getInstance()->actions();
+
+        // 记录用户请求参数
+        LogUtil::info('请求路由', self::controller, self::action, $controller);
+        LogUtil::info('请求参数', self::controller, self::action, $request->all());
+
+        $response = $next($request);
+
+        return $response;
+    }
+}

+ 37 - 0
app/Utils/Control/ActionUtil.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Utils\Control;
+class ActionUtil{
+    protected array $actions = [];// 控制器信息
+    protected static $instance;
+    public static function getInstance(): ActionUtil
+    {
+        if (empty(self::$instance)) {
+            self::$instance = new self();
+        }
+        return self::$instance;
+    }
+    /**
+     * 获取当前路由地址
+     * @return array
+     */
+    public function actions(){
+        $action = request()->route()->getAction();
+        $actions = str_replace($action['namespace'].'\\','',!empty($action['controller'])?$action['controller']:'');
+        $actions = str_replace('\\','/',$actions);
+        if (!empty($actions)){
+            $action = explode('@',$actions);
+            $this->actions['controller'] = !empty($action[0])?$action[0]:'CommonController.php';
+            $this->actions['action'] = !empty($action[1])?$action[1]:'common';
+        }else{
+            $this->actions['controller'] = 'CommonController.php';
+            $this->actions['action'] = 'common';
+        }
+        return $this->actions;
+    }
+
+    public function get()
+    {
+        return $this->actions;
+    }
+}

+ 149 - 0
app/Utils/LogUtil.php

@@ -0,0 +1,149 @@
+<?php
+namespace App\Utils;
+
+/**
+ * Author:Panda
+ * Email:joeyoung0314@qq.com
+ * Class LogUtil
+ * @package App\Utils
+ */
+class LogUtil {
+    /**==============日志系统==============**/
+
+    static $logArr = array();
+    static $logRootPath = '';//日志根目录
+    static $logExtPath = '';//日志根目录02
+    static $logExtTypePath = 'api/';//默认通道Api
+
+    public static function getInstance($logExtTypePath){
+        self::$logExtTypePath = $logExtTypePath;
+    }
+
+    /**
+     * 日志级别:普通
+     * @param string $logTitle 日志名称
+     * @param string $logName 日志目录
+     * @param string $logFile 日志文件名
+     * @param array $content 日志参数
+     */
+    public static function info($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
+        self::writeLog($content,$logName,$logFile,$logTitle,'local.INFO');
+    }
+
+    /**
+     * 日志级别:警告
+     * @param string $logTitle 日志名称
+     * @param string $logName 日志目录
+     * @param string $logFile 日志文件名
+     * @param array $content 日志参数
+     */
+    public static function warning($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
+        self::writeLog($content,$logName,$logFile,$logTitle,'local.WARNING');
+    }
+
+    /**
+     * 日志级别:错误
+     * @param string $logTitle 日志名称
+     * @param string $logName 日志目录
+     * @param string $logFile 日志文件名
+     * @param array $content 日志参数
+     */
+    public static function error($logTitle = '', $logName = 'Common', $logFile = 'common',$content = [] ){
+        self::writeLog($content,$logName,$logFile,$logTitle,'local.ERROR');
+    }
+
+    /**
+     * 日志内容保存
+     * @param $content
+     * @param string $logName 日志模块名称
+     * @param string $logFile 日志内容
+     * @param string $logTitle 日志内容头部
+     * @param string $status
+     *
+     */
+    private static function writeLog($content, $logName = 'Common', $logFile = 'common', $logTitle = '',$status = 'INFO') {
+        $logPath = $logName.'_'.$logFile;
+        $logWhite = self::whiteLog();
+        if(in_array($logPath,$logWhite)) return;//验证日志黑名单
+        //if(is_array($content) && isset($content['route']) && $content['route'] == 'Param_uploadFileImg') return;//黑名单
+        //获取日志文件目录
+        if (empty(self::$logRootPath)) self::$logRootPath = realpath(base_path()) . '/storage/logs/Log/'.self::$logExtTypePath;
+
+        if (empty(self::$logExtPath))  self::$logExtPath  =  realpath(base_path()) . '/storage/logs/Log02/'.self::$logExtTypePath;
+
+        if (empty(self::$logArr[$logName][$logFile])) {
+            self::$logArr[$logName][$logFile] = '================ Start ================'.PHP_EOL;
+        }
+        if (is_array($content)) $content = json_encode($content, JSON_UNESCAPED_UNICODE);
+        if (!empty($logTitle)) $logTitle .= ':';
+        self::$logArr[$logName][$logFile] .= '['.(date('Y-m-d H:i:s')."] {$status}: {$logTitle}{$content}".PHP_EOL.PHP_EOL);
+    }
+
+    public static function close() {
+        try{
+
+            if (empty(self::$logArr)) return;
+
+            //没有Log目录 创建Log02目录
+            if(!file_exists(self::$logRootPath)){
+                $tem_path = self::$logExtPath;
+                if(!file_exists($tem_path)){
+                    mkdir($tem_path, 0777 ,true);
+                }
+                $logPath = $tem_path.date('Y_m_d');
+            }else{
+                $logPath = self::$logRootPath.date('Y_m_d');
+            }
+
+            //创建日志文件目录
+            if (!file_exists($logPath)) mkdir($logPath);
+
+            //逐个日志文件写入
+            foreach (self::$logArr as $key => $value) {
+                $logDir = $logPath.'/'.$key;
+                if (!file_exists($logDir)) mkdir($logDir , 0777 , true);
+                self::logEnd($value, $logDir);
+            }
+            self::$logArr = null;
+        }catch (Exception $e){
+            return;
+        }
+    }
+    public static function logEnd($data, $logDir) {
+        foreach ($data as $k => $v) {
+            //获取日志文件名 避免单个日志文件太大
+            $count = 1;
+            while(true) {
+                //生成日志文件名
+                $logFile = "{$logDir}".'/'."{$k}_{$count}.log";
+
+                //第一次写入日志
+                if (!is_file($logFile)) break;
+
+                //日志文件未大于1M
+                $file = filesize($logFile) / 1024 / 1024;// 单位M
+                if ($file < 2) break;
+
+                $count++;
+            }
+            $v = rtrim($v);
+            $v .= PHP_EOL.'================ End ================'.PHP_EOL.PHP_EOL;
+
+            error_log($v, 3, $logFile);
+//            $ch = fopen($logFile, 'ab');
+//            fwrite($ch, $v);
+//            fclose($ch);
+        }
+    }
+
+    /**
+     * 日志黑名单
+     * @return array
+     */
+    public static function whiteLog()
+    {
+        return array(
+//            'Framework/PassportController_login',
+        );
+    }
+}