如何給框架添加API接口日志


前言

  用的公司的框架,是MVC框架,看了下里面的日志基類,是操作日志,對增刪改進行記錄,

  誇張的是一張業務的數據表 需要一張專門的日志表進行記錄,

  就是說你寫個更新,添加的方法都必須寫一遍操作日志,代碼看了,不多,6行。

  不懂為什么要這樣做,API 簡潔萬歲!~  於是果斷在生命周期中插入接口日志。

思路1   一次插入

  1、生命周期在未進入接口前拿到相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息),

  2、然后正常往下走調用接口的方法,

  3、等待接口中的方法執行完,帶着返回值回到生命周期的后半部分,在這里采集接口的調用結果,返回狀態碼,數據等信息。

  4、寫入日志庫,OK

思路2   一次插入,一次更新

  1、生命周期在未進入接口前拿到相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息),

  2、直接插入日志,並記錄插入的log_id

  2、然后正常往下走調用接口,

  3、等待接口中的方法執行完,帶着返回值回到生命周期的后半部分,在這里采集接口的返回信息,返回狀態碼,返回數據、響應時間、耗時等信息。

  4、根據log_id更新日志,OK

Action

  一頓研究,發現這框架竟然跟主流框架有點合不來,生命周期中 先new 訪問的類,然后執行該類的某個方法,然后沒了~ Waht FK

  進去一看,原來接口調用過程結束后 是 直接在當前執行的函數中 就echo 然后exit,不是我所熟悉的 先 return  然后在生命周期中echo並exit。

  好吧,男人有苦從不說,我自清風向明月。

  因為生命周期的不完整,以及程序執行過程中隨時可能exit, 故決定 分兩次記錄日志,一次插入,一次修改,並封裝一個統一返回數據的函數,確保每個接口最終都會調用

    在生命周期的前半部分,進入接口,找一個空地,蹭一蹭然后采集相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息)

  直接插入api_log表,返回 log_id  存到靜態變量中,

    下面正常調用接口的函數,但是在函數的最后,不論成功或失敗,我們都會格式化一下返回的數據結構,

    這里我們可以利用一下,在這里采集接口的返回時數據,並根據log_id進行更新操作。

僅提供插入日志的代碼進行參考,畢竟每個框架的聲明周期都有區別

/**
     * 添加日志
     * User: LiZheng  271648298@qq.com
     * Date: 2019/3/20
     */
    public static function log()
    {
        $log_data['name'] = $_SERVER['REQUEST_URI'];     //接口名
        $log_data['platform'] = APP_NAME;                //本應用名稱
        $url = explode("/", $log_data['name']);
        $log_data['controller'] = $url[2];
        $log_data['action'] = $url[3];
        $log_data['params'] = is_string(lib_context::post_all()) ? lib_context::post_all() :json_encode(lib_context::post_all());         //請求參數
        $log_data['method'] = $_SERVER['REQUEST_METHOD'];    //請求方法
        $log_data['header'] = $_SERVER['CONTENT_TYPE'];  //請求頭
        $log_data['client'] = get_client_ip() ; //當前用戶IP
        $log_data['server'] = $_SERVER['HTTP_HOST'];  //服務器主機的名稱,端口號不是80時,會顯示端口號
        self::$log_start = intval(microtime(true) * 1000);
        $log_data['start_time'] = time();
        $info = self::$_module_log -> insert_id($log_data);
        self::$log_id = $info['info'];
        self::$api_url = $url[2].'/'.$url[3];
        self::$api_folder = $url[1];
    }

/**
     * 接口json 標准輸出,並更新日志
     * @param $result
     * User: LiZheng  271648298@qq.com
     * Date: 2019/3/20
     */
    public static function json_output($result)
    {
        $log_data['response_code'] = $result['code'];
        $log_data['response_msg'] = $result['msg'];
        if(isset($result['data']))
        {
            $log_data['response_data'] = json_encode($result['data'],true);
        }
        else
        {
            $log_data['response_data'] = json_encode(array(),true);
        }
        $log_data['end_time'] = time();
        $log_data['life'] = intval(microtime(true) * 1000) - self::$log_start;

        self::$_module_log -> update_by_id(self::$log_id, $log_data);
        echo json_encode($result);
        exit;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM