Browse Source

新的日志方式,与全站维护开关

lizhen_gitee 1 year ago
parent
commit
9c7428da44

+ 1 - 1
application/api/controller/Report.php

@@ -48,7 +48,7 @@ class Report extends Api
         $id = Db::name('report')->insertGetId($data);
         $this->success();
     }
-
+///////////////////////////没用到/////////////////////////
     //IM举报
     public function addone_im(){
         $type = input('type',1);//类型:1=文字,2=语音,3=图片,4=阅后即焚

+ 11 - 4
application/api/library/ExceptionHandle.php

@@ -4,6 +4,7 @@ namespace app\api\library;
 
 use Exception;
 use think\exception\Handle;
+use app\utils\LogUtil;
 
 /**
  * 自定义API模块的错误显示
@@ -28,12 +29,18 @@ class ExceptionHandle extends Handle
             $statuscode = $code = $e->getStatusCode();
             $msg = $e->getMessage();
         }
-
+        $msg = '网络开小差了';
         $result = ['code' => $code, 'msg' => $msg, 'time' => time(), 'data' => null];
 
-        //记录app异常返回结果
-        if(defined('API_REQUEST_ID')) { //记录app正常返回结果
-            db('api_request_log')->where('id',API_REQUEST_ID)->update(['result'=>json_encode($result)]);
+        if (defined('API_REQUEST_LOG_TYPE') && defined('API_REQUEST_LOG_TYPE') == 1){
+            LogUtil::error('result','Api-Middleware-Log','request_log',$result);
+            LogUtil::error('ExceptionMsg','Api-Middleware-Log','request_log',$e->getMessage());
+            LogUtil::error('Exception','Api-Middleware-Log','request_log',$e);
+        }else{
+            //记录app异常返回结果
+            if(defined('API_REQUEST_ID')) { //记录app正常返回结果
+                db('api_request_log')->where('id',API_REQUEST_ID)->update(['result'=>json_encode($result)]);
+            }
         }
 
         return json($result, $statuscode);

+ 59 - 13
application/common/controller/Api.php

@@ -67,6 +67,11 @@ class Api
     public $page = 1;
     public $listrow = 10;
     /**
+     * @var int 日志类型 1 文件;2sql
+     */
+    public $logType = 1;
+
+    /**
      * 构造方法
      * @access public
      * @param Request $request Request 对象
@@ -76,6 +81,17 @@ class Api
         $this->request = is_null($request) ? Request::instance() : $request;
         $this->page = input('page',1);
         $this->listrow= input('listrow',10);
+
+        if(config('site.apisite_switch') == 0){
+            $controllername = $this->request->controller();
+            $controllername = strtolower($controllername);
+
+            if(!in_array($controllername,['notifynew','easemob','payios'])){
+                $notice = config('site.apisite_notice') ?: '全站维护中';
+                $this->error($notice);
+            }
+        }
+
         // 控制器初始化
         $this->_initialize();
         //日志
@@ -369,16 +385,34 @@ class Api
         $controllername = $this->request->controller();
         $actionname     = $this->request->action();
 
-        $data = [
-            'uid'   => $this->auth->id,
-            'api'   => $modulename.'/'.$controllername.'/'.$actionname,
-            'params' => json_encode($this->request->param()),
-            'addtime'  => time(),
-            'adddatetime'  => date('Y-m-d H:i:s'),
-            'ip'   => request()->ip(),
-        ];
-        $request_id = db('api_request_log')->insertGetId($data);
-        defined('API_REQUEST_ID') or define('API_REQUEST_ID', $request_id);
+        if(strtolower($actionname) == 'callback'){
+            return true;
+        }
+
+        defined('API_REQUEST_LOG_TYPE') or define('API_REQUEST_LOG_TYPE', $this->logType);
+        $params = $this->request->request();
+        if ($this->logType === 1){
+            //日志统一写入
+            register_shutdown_function([new LogUtil, 'close']);
+            LogUtil::getInstance('Api/'); //设置日志存入通道
+
+            LogUtil::info('uid', 'Api-Middleware-Log', 'request_log', $this->auth->id);
+            LogUtil::info('url', 'Api-Middleware-Log', 'request_log', $modulename . '/' . $controllername . '/' . $actionname);
+            LogUtil::info('params', 'Api-Middleware-Log', 'request_log', $params);
+            LogUtil::info('ip', 'Api-Middleware-Log', 'request_log', request()->ip());
+
+        }else{
+            $data = [
+                'uid'   => $this->auth->id,
+                'api'   => $modulename.'/'.$controllername.'/'.$actionname,
+                'params' => json_encode($params),
+                'addtime'  => time(),
+                'adddatetime'  => date('Y-m-d H:i:s'),
+                'ip'   => request()->ip(),
+            ];
+            $request_id = db('api_request_log')->insertGetId($data);
+            defined('API_REQUEST_ID') or define('API_REQUEST_ID', $request_id);
+        }
 
     }
 
@@ -394,11 +428,23 @@ class Api
 
 
     protected function request_log_update($log_result){
-        if(defined('API_REQUEST_ID')) { //记录app正常返回结果
-            if(strlen(json_encode($log_result['data'])) > 10000) {
+        $actionname     = $this->request->action();
+        if(strtolower($actionname) == 'givegifttoyou'){
+            //return true;
+        }
+
+        if ($this->logType === 1){
+            if (strlen(json_encode($log_result['data'])) > 1000) {
                 $log_result['data'] = '数据太多,不记录';
             }
-            db('api_request_log')->where('id',API_REQUEST_ID)->update(['result'=>json_encode($log_result)]);
+            LogUtil::info('result', 'Api-Middleware-Log', 'request_log', $log_result);
+        }else{
+            if(defined('API_REQUEST_ID')) { //记录app正常返回结果
+                if(strlen(json_encode($log_result['data'])) > 1000) {
+                    $log_result['data'] = '数据太多,不记录';
+                }
+                db('api_request_log')->where('id',API_REQUEST_ID)->update(['result'=>json_encode($log_result)]);
+            }
         }
     }
 

+ 2 - 0
application/extra/site.php

@@ -113,4 +113,6 @@ return array (
 3、收益提现时平台将收取6.5%的手续费',
   'intimacy_rule' => '1.在你们私信聊天当中,每产生消耗金币的行为(消息互动,语音聊天,视频聊天,赠送礼物都包含在内)1亲密度=100金币
 2.不同等级可解锁不同权限',
+  'apisite_switch' => '1',
+  'apisite_notice' => '全站维护中!!',
 );

+ 169 - 0
application/utils/LogUtil.php

@@ -0,0 +1,169 @@
+<?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 $controller 控制器
+     * @param string $action 方法
+     * @param ...$content //日志参数
+     */
+    public static function insert(string $controller,string $action, ...$content){
+        self::writeLog($content,'Api-Middleware-Log', 'request_log',"{$controller}/{$action}",'local.INFO');
+    }
+
+    /**
+     * debug 日志
+     * @param ...$content
+     */
+    public static function debug(...$content){
+        self::writeLog($content,'Api-Middleware-Log', 'request_log',"debug",'local.WARNING');
+    }
+
+    /**
+     * 日志级别:普通
+     * @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 (empty(self::$logRootPath)) self::$logRootPath = realpath(ROOT_PATH) . '/runtime/Log/'.self::$logExtTypePath;
+
+        if (empty(self::$logExtPath))  self::$logExtPath  =  realpath(ROOT_PATH) . '/runtime/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',
+        );
+    }
+}