如何给框架添加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;
}
如何给框架添加API接口日志的更多相关文章
- android框架Java API接口总注释/**@hide*/和internal API
Android有两种类型的API是不能经由SDK访问的 l 第一种是位于com.android.internal包中的API我,位于frameworks/base/core/java/com/andr ...
- Yii2框架添加API Modules
原文链接:http://www.itnose.net/detail/6459353.html : 一.环境部署 1. read fucking Yii Documents. http://www.yi ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是r ...
- IdentityServer4实现.Net Core API接口权限认证(快速入门)
什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...
- 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 ...
- 循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理
在前面随笔<循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理>介绍了一个系统最初接触到的前端登录处理的实现,但往往对整个系统来说,一般会有很多业务对 ...
- API接口幂等性框架设计
表单重复提价问题 rpc远程调用时候 发生网络延迟 可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的 过一段时间失效 分布式: redis+to ...
- Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现
最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...
- Auty自动化测试框架第三篇——添加异常处理与日志收集
[本文出自天外归云的博客园] 本次对框架进行完善,增加了日志收集功能和修饰运行功能,完善后的lib目录如下:
随机推荐
- 字符串string 、byte[]、MemoryStream、Base64String的相互转换
1.字符串转比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] bt=Convert ...
- .Net Core 编码规范
.Net Core 编码规范 标签: 未分类 概述 规范制定原则 方便代码的交流和维护. 不影响编码的效率,不与大众习惯冲突. 使代码更美观.阅读更方便. 使代码的逻辑更清晰.更易于理解. 术语定义 ...
- Nginx 初識
今天簡單了解了一下Nginx,并在本機安裝,并簡單配置了一下,道理什麼的還不懂,就是看能不能跑起來. 1.安裝從官網下載就好,把文件隨便解壓在一個英文目錄裡面. 然後修改配置文件,修改的內容如下: 2 ...
- Php中的goto用法
我们先举个简单示例: <?php goto LABEL; //这个标签自定义 echo '乔峰'; LABEL: echo '鸠摩智'; 以上例程会输出:鸠摩智 解释:goto 操作符可以用来跳 ...
- 原生JS编写兼容IE6,7,8浏览器无缝自动轮播(带按钮切换)
项目要求页面兼容IE6,7,8等浏览器,我们可能会遇到这个轮播效果,轮播板块要求:无限循环.自动轮播和手动切换功能,每一次滚动一小格,网上有很多这类插件,例如:swiper等! 但是很多都是不兼容IE ...
- java环境配置记录
1.启动Eclipse时报错:Failed to load the JNIshared library 这种问题是因为Java与Eclipse两个软件的位数不一样,一个是32位,一个是64位,存在冲突 ...
- 利用OpenStreetMap(OSM)数据搭建一个地图服务
http://www.cnblogs.com/LBSer/p/4451471.html 图 利用OSM数据简单发布的北京地图服务 一.OSM是什么 开放街道图(OpenStreetMap,简称O ...
- C++ 重点关键字
const 四种用法 1.修饰变量起到限定只读作用: void func(const int a, const string str) {...} const int* func(...) {...} ...
- iead2018创建JavaWe工程
菜单栏中 File-> Project,弹出如下界面,选择 Java并勾选 Web Application 填写 Project Name 配置 tomcat 点击右上角的绿色的小锤子,然后打开 ...
- Python变量之白首如新,倾盖如故
python中的变量变量:将运算的中间结果暂存到内存中,方便后续程序调用.变量的命名规则:1.变量名由字母.数字.下划线组成.2.变量名可以用字母.下划线开头,但是不能以数字开头.3.变量名是区分大小 ...