前言

  用的公司的框架,是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. SpringMVC页面向Controller传参

    关于SpringMVC页面向Controller传参的问题,看了网上不少帖子,大多总结为以下几类: 1.直接把页面表单中相关元素的name属性对应的值作为Controller方法中的形参. 这个应该是 ...

  2. 委托(4).net 3.5中的委托

    .net 3.5引入了Linq,lambda表达式,所以委托的创建变得更加简单和优雅了. .net 3.5中的委托 引入lambda表达式后,就不需要再使用匿名方法了,使得创建委托的方式更加简单和优雅 ...

  3. java-自定义数据排序

    导读:由于基本类型的数据都实现了一个共同的接口java.lang.Comparable接口,都实现了该接口下面的compareTo()方法,因此想要利用面向对象实现现实生活中的一些情景再现,比如新闻根 ...

  4. Python全栈之路(目录) - 含资料(持续更新)

    一. Python全栈之路 - 目录 Python基础 Python进阶 网络编程 并发编程 前端 数据库 Python Web框架之Django 前端框架之Vue Linux Flask+智能玩具 ...

  5. 四边形不等式优化DP

    记录一下,以免忘了 对于一个形如 \[dp[i][j]=min(dp[i][k]+dp[k][j]+w[i][j])\] 的转移方程(注意取最大值时不一定满足四边形不等式) 定理1 若对于\(a \l ...

  6. H5移动端rem适配

    /** * 移动端自适应 */ <meta name="viewport" content="width=device-width,user-scalable=no ...

  7. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  8. 美团技术沙龙01 - 58到家服务的订单调度&数据分析技术

    1. 2015.4.15 到家服务的订单调度&数据分析技术 58到家· 黄海斌 @xemoaya 2.agenda • 58到家介绍 • 订单管理系统介绍 • 数据分析技术的应用 3.2015 ...

  9. postgresql 日志报错could not write to log file: No space left on device,could not write lock file "postmaster.pid": No space left on device

    今天遇到了一个特别奇怪的问题,我在用docker容器的时候,发现我的postgresql怎么也启动不起来 尝试了N多种办法,最后看了看postgresql的日志发现 postgresql 日志中报错 ...

  10. spring学习总结——装配Bean学习三(xml装配bean)

    通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...