麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Python > 正文

詳解Python logging調用Logger.info方法的處理過程

2020-02-23 06:26:37
字體:
來源:轉載
供稿:網友

本次分析一下Logger.info的流程

1. Logger.info源碼:

 def info(self, msg, *args, **kwargs):  """  Log 'msg % args' with severity 'INFO'.  To pass exception information, use the keyword argument exc_info with  a true value, e.g.  logger.info("Houston, we have a %s", "interesting problem", exc_info=1)  """  if self.isEnabledFor(INFO):   self._log(INFO, msg, args, **kwargs)

注釋中反應了可以通過 msg和不定參數args來進行日志的格式化。
真實的調用為:_log方法:

2. Logger._log方法:

 def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):  """  Low-level logging routine which creates a LogRecord and then calls  all the handlers of this logger to handle the record.  """  sinfo = None  if _srcfile:   #IronPython doesn't track Python frames, so findCaller raises an   #exception on some versions of IronPython. We trap it here so that   #IronPython can use logging.   try:    fn, lno, func, sinfo = self.findCaller(stack_info)   except ValueError: # pragma: no cover    fn, lno, func = "(unknown file)", 0, "(unknown function)"  else: # pragma: no cover   fn, lno, func = "(unknown file)", 0, "(unknown function)"  if exc_info:   if isinstance(exc_info, BaseException):    exc_info = (type(exc_info), exc_info, exc_info.__traceback__)   elif not isinstance(exc_info, tuple):    exc_info = sys.exc_info()  record = self.makeRecord(self.name, level, fn, lno, msg, args,         exc_info, func, extra, sinfo)  self.handle(record)

最后兩行:

生成日志記錄:

record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)

處理日志記錄

self.handle(record)

2 生成日志記錄:

 def makeRecord(self, name, level, fn, lno, msg, args, exc_info,     func=None, extra=None, sinfo=None):  """  A factory method which can be overridden in subclasses to create  specialized LogRecords.  """  rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,        sinfo)  if extra is not None:   for key in extra:    if (key in ["message", "asctime"]) or (key in rv.__dict__):     raise KeyError("Attempt to overwrite %r in LogRecord" % key)    rv.__dict__[key] = extra[key]  return rv

調用_logRecordFactory初始化一個日志記錄實例,_logRecordFactory 其實就是LogRecord類,初始化時,可能包含logger的name, level、調用的函數、行號、日志字符串、模板參數、堆棧信息等。

再看extra信息,extra到底有何用?現在從代碼中可以看到,只是更新到生成的日志記錄實例的__dict__中去.猜測:肯定會在生成最終的日志字符串的時候會用到。繼續往下看。

3 處理日志記錄self.handle(record):

Logger繼承自Filterer,

 def handle(self, record):  """  Call the handlers for the specified record.  This method is used for unpickled records received from a socket, as  well as those created locally. Logger-level filtering is applied.  """  if (not self.disabled) and self.filter(record):   self.callHandlers(record)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品一区二区在线观看 | 色悠悠久久久久 | 一二区成人影院电影网 | 全免费午夜一级毛片真人 | 羞羞网站视频 | 鲁人人人鲁人人鲁精品 | 羞羞电影在线观看www | v片在线看 | 国产激情网 | 欧美日韩在线视频一区 | 宅男噜噜噜66一区二区 | 一本色道久久综合亚洲精品小说 | 精品久久久久久国产三级 | 免费久久久久久久 | 亚洲精品一二三区 | 成人精品免费在线观看 | 成人在线网站 | 欧美a级在线免费观看 | 亚洲成人精品久久久 | 欧美三级美国一级 | 亚洲一区二区免费 | 中文字幕在线观看视频一区 | 又黄又爽免费无遮挡在线观看 | 在线观看中文字幕av | 亚洲3atv精品一区二区三区 | 91短视频在线播放 | av免费在线观看免费 | 午夜在线视频一区二区三区 | 亚洲午夜久久久久 | 成人影片在线免费观看 | 国产免费一区二区三区在线能观看 | 国产美女视频一区 | 精品影视一区二区 | 国语自产免费精品视频在 | 13一14毛片免费看 | 视频一区 在线 | 中文字幕免费看 | 成年免费网站 | 国产欧美日韩视频在线观看 | 亚洲国产精品一区二区久久 | 欧美自拍 |