感谢关注天善智能,走好数据之路↑↑↑
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
本文作者:天善智能社区专家 Ljian1992
天善智能社区地址:https://www.hellobi.com/
前言
对于如何优雅的实现打印requestId这事情上,google了半天都没有找到一个满足我的需求的实现。唯有自己去实现一个,整个思路我觉得还挺有趣的,值得分享出来,所以就有了这文章。
需求
我负责的子系统有:IP管理系统,爬虫管理系统,爬虫系统。这个只是整个系统的其中一部分。这个时候,如果某个请求或者某个服务出错了,需要定位问题的原因就比较复杂了。为了快速定位问题,很核心的一个点日志规范,而日志规范中最最最重要的一点就是要有个requestId来跟踪整个整一个请求或服务的调用链路。需求来了,为每一条日志都加上requestId这个参数。这个需求再抽象一下,就是为每一个日志都增加一个前缀。这个前缀可以有requestId, server_name等等信息。这样抽象之后呢,如果还需要增加其他参数也方便。ps:requestId的生成可以简单粗暴的uuid来,也可以让它带有信息(IP,服务名等等),这个不是本文的重点,最好就由一个专门的函数来生成,以后有变化改起来也方便。正如某名言说的那样,用一个稳定的东西来包装一个不稳定的东西以提供一个稳定的服务。
实现思路
不用动脑子想到的实现方式
类的初始化参数&函数参数都提供一个参数专门来传递log前缀
做一个装饰器给需要打印业务log的方法或函数使用
对于方式1,这个实现起来巨恶心,入侵过大,偶合过大我的内心是拒绝的。对于方式2稍微好了一点,传说当中的切面编程,对代码没有入侵性,但是粒度太大,函数或者方法内的log无法加上前缀,肯定是不行的,所以只能放弃。所以此时又把目光放到方式1上,此时大脑冒出了一个大胆的想法,给整个系统的类或函数打补丁。补丁的作用就是为类的初始化方法添加上log前缀的可选参数,函数参数添加上log前缀的可选参数。然后还居然真的有相关的模块可以获取方法或者类的参数信息,并修改,这个高级功能只存在python3之中。准备撸起袖子就开干的