如何给框架添加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接口日志的主要内容,如果未能解决你的问题,请参考以下文章
API接口自动化测试框架搭建(十九)-日志模块封装(logging模块)
转如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage