如何给框架添加API接口日志
2021-06-11 06:03
标签:exit params 操作 type 框架 mvc 参考 请求 参数 前言 用的公司的框架,是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进行更新操作。 仅提供插入日志的代码进行参考,毕竟每个框架的声明周期都有区别 如何给框架添加API接口日志 标签:exit params 操作 type 框架 mvc 参考 请求 参数 原文地址:https://www.cnblogs.com/lz0925/p/10573598.html/**
* 添加日志
* 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;
}
上一篇:C# Socket的TCP通讯