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

Posted Eternity味道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给框架添加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  [email protected]
     * 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  [email protected]
     * 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;
    }

 

以上是关于如何给框架添加API接口日志的主要内容,如果未能解决你的问题,请参考以下文章

laravel添加api缓存系统

如何在地图片段 API v2 布局顶部添加按钮

API接口自动化测试框架搭建(十九)-日志模块封装(logging模块)

转如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage

API接口自动化测试框架搭建(二十四)-框架主入口main.py设计&log日志调用和生成

日志门面框架Slf4j