<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當新增一條log記錄時,最終將呼叫Logger類的_log方法,這個方法首先會建立一個LogRecord物件。LogRecord物件需要(filename, lineno, funcname)引數資訊。這是通過如下語句得到的:
fn, lno, func = self.findCaller()
f = currentframe() #f是frame物件,每個方法呼叫生成一個frame物件,放在程式堆疊中。 if f is not None: f = f.f_back rv = "(unknown file)", 0, "(unknown function)" while hasattr(f, "f_code"): co = f.f_code #獲取code物件,它包含filename屬性,funcname屬性 filename = os.path.normcase(co.co_filename) if filename == _srcfile: #_srcfile是這個模組檔案自己的檔名,當檔名不再相同時 f = f.f_back # 得到外部呼叫者的frame,這就是需要的。 continue rv = (filename, f.f_lineno, co.co_name) break return rv
def currentframe(): """Return the frame object for the caller's stack frame.""" try: raise Exception #丟擲異常,將生成traceback物件,其中包含frame物件。 except: #sys.exc_traceback.tb_frame當前的frame, f_back呼叫著的frame return sys.exc_traceback.tb_frame.f_back #sys._getframe(3)返回的並不是當前的frame,3應該是計算好了的,減少迴圈的次數,返回的是logger.error()的frame if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)
首先,logging模組中logger層級關係是一個樹形關係的結構,這個關係的樹根是'root'。
root = RootLogger(WARNING) #RootLogger類是Logger的子類,無特殊功能,只是定義名字為‘root'。 Logger.root = root Logger.manager = Manager(Logger.root)
當呼叫logging.getLogger(),用以獲取某個Logger時,如果引數為空,則返回‘root’。否則,呼叫Manager的getLogger()方法獲取Logger。
def getLogger(name=None): """ Return a logger with the specified name, creating it if necessary. If no name is specified, return the root logger. """ if name: return Logger.manager.getLogger(name) else: return root
def getLogger(self, name): """ Get a logger with the specified name (channel name), creating it if it doesn't yet exist. This name is a dot-separated hierarchical name, such as "a", "a.b", "a.b.c" or similar. If a PlaceHolder existed for the specified name [i.e. the logger didn't exist but a child of it did], replace it with the created logger and fix up the parent/child references which pointed to the placeholder to now point to the logger. """ rv = None _acquireLock() try: if name in self.loggerDict: rv = self.loggerDict[name] if isinstance(rv, PlaceHolder): ph = rv rv = _loggerClass(name) rv.manager = self self.loggerDict[name] = rv self._fixupChildren(ph, rv) self._fixupParents(rv) else: rv = _loggerClass(name) rv.manager = self self.loggerDict[name] = rv self._fixupParents(rv) finally: _releaseLock() return rv
Manager物件中的loggerDict字典,存放logger名字和logger物件的對映關係。PlaceHolder類,是一個容器。
例如,名字為'sell'的PlaceHolder物件,首先還不存在'sell'的logger,然後,所以以'sell‘開頭的logger在這個物件內都存在一個參照,如'sell.food','sell.cloth.china'等已有的logger物件。 當呼叫getLogger()獲取一個未存在的logger時,如名字為'level1.level2', 首先建立一個名字為'level1.level2'的logger物件,並存於loggerDict中。然後,呼叫_fixupParents()。
_fixupParents()的作用:
在這個名字的層級鏈上,找到第一個logger物件,將其作為父親,並返回。鏈上不是logger物件的名字,建立一個PlaceHolder物件(如果未建立),將自己加入其中。
例如,新增‘level1.level2.level3’的logger,呼叫_fixupParents將建立一個名字為'level1.level2‘的PlaceHolder物件,建立一個名字為’level1‘的PlaceHolder物件,並將’level1.level2.level3‘這個logger分別加入以上兩個PlaceHolder物件容器內,將它的父親設定為’root‘。
總之,_fixupParents是使logger物件指向真正的父親節點(logger物件),並將logger自己加入到所有上層的PlaceHolder物件容器內。
如果獲取一個名字已存在於loggerDict中,並且這個名字對應的是一個先前建立的PlaceHolder物件。首先,建立一個對應名字的logger物件。然後,呼叫_fixupChild(),修正這個PlaceHolder物件所包含的下游logger物件的父親。最後,呼叫_fixupParent(),作用與上一步相同。
父子層級關係,主要作用是,當logger物件的propagate屬性值1(預設值)時,每條logRecord記錄都會傳給父logger處理。這樣可以只需要定義好‘root’根logger物件,其他的logger定義個名字,根據模組名,類名等,然後繫結一個NullHandler。最後,所有的logRecord將交給’root‘統一處理處理。這是多模組產生統一格式log的方式。
以上就是程式碼解析python標準庫logging模組的詳細內容,更多關於python標準庫logging模組的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45