背景
项目开发的痛点之一没有输入输入日志,之前的框架设计没做好客户端输入输出的日志处理,导致服务端如果不断点,就无法知道客户端发了什么和收到什么。难以排查问题,降低了开发效率。现在需要在当前框架修改使其有客户端调用参数与回传的日志。
方案选择
为了解决这个问题考虑了4个方案来实现:
在框架调用的公共入口和出口进行数据打印。
如果项目是json解析数据的是可以实现的,但当前项目采用了protobuff解析数据,在上层调用无法知道当前的解析对象,所以无法解析出数据。在之前的接口实现功能的地方进行日志打印。
实现接口功能时可以解析数据打印,但几百个接口工作量大而且代码复用性差,这是个可行但不好的方案。修改proto解析对象的生成模板代码,对其加入日志输出。
可以修改第三方代码来进行日志输出,但这种方案只能做为穷途末路的情况下的最后手段。首先修改第三方代码工作量大,容易出现问题,其次需要自己维护一个第三方的版本分支,以后无法升级第三方,最后增加后续维护接手的工作量。通过高阶函数对proto 解析方法进行重新定义。
这个方案修改了proto解析对象的内部方法,可以对所有proto解析进行进行日志输出,这个方案从代码复用性,工作量,可维护性,对第三方库的侵入性来综合考量是当前最好的解决方案。
综合上考虑,选择了第4个解决方案。
方案实现
具体实现如参考如下,代码量不多,只有些比较少用到的功能方法,代码为Typescript代码:
1 | import * as pro from '../../../../protoFiles/protoCompiled'; |
实际上日志输出应该在框架层面封装好,但目前框架已经成形,这种实现从全局来看也并不完美。