当前位置: 首页 > 后端技术 > Python

pythonLoggerAdapter怎么玩

时间:2023-03-26 11:14:15 Python

最近工作中有一个需求,就是每一个logger日志的输出,必须在message中打印一个uuid,方便全程跟踪。但是,这个消息会在新创建的线程中循环和处理。我不知道如何使用简单的方法来处理它。总不能每次打印log的时候都加上这个uuid吧。还好在看ncclient源码的时候发现了LoggerAdapter。之前的问题自然而然地迎刃而解啦,原来还可以这样玩儿!说话很便宜,给我看代码。如果'session'不在self.extra或self.extra['session']中是None:returnmsg,kwargssession=self.extra['session']ifhasattr(session,'request_id'):msg+=',request_id({})'.format(session.request_id)如果'extra'不在kwargs中:kwargs["extra"]=self.extra否则:kwargs['extra'].update(self.extra)returnsuper().process(msg,kwargs)classSession():def__init__(self):super().__init__()@propertydefrequest_id(self):返回self._request_id@request_id.setterdefrequest_id(self,request_id):self._request_id=request_idsession=Session()logger.warning('abc')logger=SessionLoggerAdapter(logger,{'session':session})session.request_id='0'logger.warning('helloworld')session.request_id='1'logger.warning('helloworld')关键点继承LoggerAdapter重写process方法,需要被添加的内容是从self.extra中读取的。self.extra中最好存放一个对象,方便打印各种需要打印的数据。新建一个adapterlogger,以key:value的形式存储对象。每次进入,都需要在消息到达时修改uuid的值。(这里的uuid就是代码中的request_id)python官网之前也研究过官网文档,但是没有抓住本质,对其理解还是不够。其实官网已经说的很清楚了。LoggerAdapter介绍:https://docs.python.org/zh-cn...LoggerAdapter的重要功能是实现输出上下文信息。从属代码是LoggerAdapter的实现:defdebug(self,msg,*args,**kwargs):"""从该适配器实例添加上下文信息后,将调试调用委托给底层记录器。"""msg,kwargs=self.process(msg,kwargs)self.logger.debug(msg,*args,**kwargs)整理流程然后通过logger打印总结不懂多看几遍,不要盲目跳过。谈话是廉价的,让我看看廉价的。FocusonFocus读写英语单词很重要。初学者python,请多多指教。