Browse Source

添加文件日志

lizhen_gitee 1 year ago
parent
commit
4e9a0bc09d

+ 9 - 3
application/api/library/ExceptionHandle.php

@@ -4,6 +4,7 @@ namespace app\api\library;
 
 use Exception;
 use think\exception\Handle;
+use app\utils\LogUtil;
 
 /**
  * 自定义API模块的错误显示
@@ -31,9 +32,14 @@ class ExceptionHandle extends Handle
 
         $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('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);

+ 36 - 15
application/common/controller/Api.php

@@ -3,6 +3,7 @@
 namespace app\common\controller;
 
 use app\common\library\Auth;
+use app\utils\LogUtil;
 use think\Config;
 use think\exception\HttpResponseException;
 use think\exception\ValidateException;
@@ -390,30 +391,50 @@ class Api
      * api 请求日志
      * */
     protected function request_log(){
+
         //api_request_log
         $modulename     = $this->request->module();
         $controllername = $this->request->controller();
         $actionname     = $this->request->action();
-
-        $data = [
-            'uid'   => $this->auth->id,
-            'api'   => $modulename.'/'.$controllername.'/'.$actionname,
-            'params' => json_encode($this->request->request()),
-            '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);
-
+        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);
+        }
     }
 
     protected function request_log_update($log_result){
-        if(defined('API_REQUEST_ID')) { //记录app正常返回结果
-            if(strlen(json_encode($log_result['data'])) > 10000) {
+        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)]);
+            }
         }
     }
 

+ 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;
+                if ($file < 1024 * 100) 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',
+        );
+    }
+}