前言

  用的公司的框架,是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;
}

如何给框架添加API接口日志的更多相关文章

  1. android框架Java API接口总注释/**@hide*/和internal API

    Android有两种类型的API是不能经由SDK访问的 l 第一种是位于com.android.internal包中的API我,位于frameworks/base/core/java/com/andr ...

  2. Yii2框架添加API Modules

    原文链接:http://www.itnose.net/detail/6459353.html : 一.环境部署 1. read fucking Yii Documents. http://www.yi ...

  3. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27    关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充   说道接口设计第一反应就是r ...

  4. IdentityServer4实现.Net Core API接口权限认证(快速入门)

    什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...

  5. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  6. 循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

    在前面随笔<循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理>介绍了一个系统最初接触到的前端登录处理的实现,但往往对整个系统来说,一般会有很多业务对 ...

  7. API接口幂等性框架设计

    表单重复提价问题 rpc远程调用时候 发生网络延迟  可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的  过一段时间失效 分布式: redis+to ...

  8. Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现

    最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...

  9. Auty自动化测试框架第三篇——添加异常处理与日志收集

    [本文出自天外归云的博客园] 本次对框架进行完善,增加了日志收集功能和修饰运行功能,完善后的lib目录如下:

随机推荐

  1. Mysql 连接数,最大并发数设置

    项目中可能会遇到MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散 ...

  2. 1.docker常用命令

    1.启动交互式容器 $ docker run -i -t IMAGE /bin/bash -i --interactive=true|false 默认是false -t --tty=true|fals ...

  3. .NET平台下使用MongoDB入门教程

    适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写 ...

  4. jQuery中each循环的跳出和结束

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  5. DIV中文字换行显示

    居然第一次遇到这种问题,还想了半天到底是怎么回事,为什么明明div设置宽度了,里面的文字超过宽度后居然不换行. (1)word-break属性,可以让浏览器实现在任意位置换行. normal:使用浏览 ...

  6. Mysql 数据库常用配置命令

    1.查看mysql数据库默认编码: mysql> show variables like "character%"; +--------------------------+ ...

  7. (详细)华为畅享7 SLA-AL00的usb调试模式在哪里打开的流程

    就在我们使用Pc链上安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则不能够成功检测到我们的手机,有时我们使用的一些功能比较好的的应用软件如之前我们使用的一个应用软件引号精灵,老版本就需要打 ...

  8. IDEA工具教程

    刚从myeclipse工具转成IntelliJ IDEA工具,在“传智播客*黑马程序员”学习了相关操作和配置,因此整理在该文章中.   文章大纲 教程文档下载地址 链接:https://pan.bai ...

  9. Docker 创建 Jira Core(Jira SoftWare) 7.12.3 中文版

    目录 目录 1.介绍 1.1.什么是 JIRA Core? 1.2.什么是 JIRA SoftWare 2.JIRA 的官网在哪里? 3.如何下载安装? 4.对 JIRA 进行配置 4.1.JIRA ...

  10. c#二进制移位运算符 "<<"及">>","&","|","^"

    移位运算符 & :按位与,其实与&&逻辑运算符有一致的地方: | :按位或,同样与||有类似的地方. ~:按位取反 ^:按位异或 <<:左移运算符 >> ...