电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python日志打印里logging.getLogger源碼分析詳解

瀏覽:18日期:2022-06-29 16:23:58
實踐環境

WIN 10

Python 3.6.5

函數說明

logging.getLogger(name=None)

getLogger函數位于logging/__init__.py腳本

源碼分析

_loggerClass = Logger# ...略 root = RootLogger(WARNING)Logger.root = rootLogger.manager = Manager(Logger.root) # ...略 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

結論:如函數注釋所述,如果調用getLogger時,如果沒有指定函數參數(即要獲取的日志打印器名稱)或者參數值不為真,則默認返回root打印器

Logger.manager.getLogger(self, name)源碼分析

該函數位于logging/__init__.py腳本

class Manager(object): ''' There is [under normal circumstances] just one Manager instance, which holds the hierarchy of loggers. ''' def __init__(self, rootnode): ''' Initialize the manager with the root node of the logger hierarchy. ''' self.root = rootnode self.disable = 0 self.emittedNoHandlerWarning = False self.loggerDict = {} self.loggerClass = None self.logRecordFactory = None 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 if not isinstance(name, str): raise TypeError(’A logger name must be a string’) _acquireLock() try: if name in self.loggerDict:rv = self.loggerDict[name]if isinstance(rv, PlaceHolder): ph = rv rv = (self.loggerClass or _loggerClass)(name) rv.manager = self self.loggerDict[name] = rv self._fixupChildren(ph, rv) self._fixupParents(rv) else:rv = (self.loggerClass or _loggerClass)(name) # _loggerClass = Loggerrv.manager = selfself.loggerDict[name] = rvself._fixupParents(rv) finally: _releaseLock() return rvLogger源碼分析

_nameToLevel = { ’CRITICAL’: CRITICAL, ’FATAL’: FATAL, ’ERROR’: ERROR, ’WARN’: WARNING, ’WARNING’: WARNING, ’INFO’: INFO, ’DEBUG’: DEBUG, ’NOTSET’: NOTSET,} # ...略 def _checkLevel(level): if isinstance(level, int): rv = level elif str(level) == level: if level not in _nameToLevel: raise ValueError('Unknown level: %r' % level) rv = _nameToLevel[level] else: raise TypeError('Level not an integer or a valid string: %r' % level) return rv # ...略class PlaceHolder(object): ''' PlaceHolder instances are used in the Manager logger hierarchy to take the place of nodes for which no loggers have been defined. This class is intended for internal use only and not as part of the public API. ''' def __init__(self, alogger): ''' Initialize with the specified logger being a child of this placeholder. ''' self.loggerMap = { alogger : None } def append(self, alogger): ''' Add the specified logger as a child of this placeholder. ''' if alogger not in self.loggerMap: self.loggerMap[alogger] = None class Logger(Filterer): ''' Instances of the Logger class represent a single logging channel. A 'logging channel' indicates an area of an application. Exactly how an 'area' is defined is up to the application developer. Since an application can have any number of areas, logging channels are identified by a unique string. Application areas can be nested (e.g. an area of 'input processing' might include sub-areas 'read CSV files', 'read XLS files' and 'read Gnumeric files'). To cater for this natural nesting, channel names are organized into a namespace hierarchy where levels are separated by periods, much like the Java or Python package namespace. So in the instance given above, channel names might be 'input' for the upper level, and 'input.csv', 'input.xls' and 'input.gnu' for the sub-levels. There is no arbitrary limit to the depth of nesting. ''' def __init__(self, name, level=NOTSET): ''' Initialize the logger with a name and an optional level. ''' Filterer.__init__(self) self.name = name self.level = _checkLevel(level) self.parent = None self.propagate = True self.handlers = [] self.disabled = False # ... 略

結論:如果調用logging.getLogger()時,有指定日志打印器名稱,且名稱為真(不為空字符串,0,False等False值),

1)如果名稱為不存在的日志打印器名稱,則,且參數值為真,但是即要獲取的日志打印器名稱)或者參數值不為真,則創建一個名為給定參數值的日志打印器,該日志打印器,默認級別默認為NOTSET,disable_existing_loggers配置為False,propagate配置為True。然后在日志打印器字典中記錄該名稱和日志打印器的映射關系,接著調用 _fixupParents(創建的日志打印器實例)類實例方法--為日志打印器設置上級日志打印器,最后返回該日志打印器。

2)如果名稱已存在日志打印器名稱,則獲取該日志打印器,然后判斷日志打印器是否為PlaceHolder類實例,如果是,則創建一個名為所給參數值的日志打印器,同第1)點,該日志打印器,默認級別默認為NOTSET,disable_existing_loggers配置為False,propagate配置為True。然后在日志打印器字典中記錄該名稱和日志打印器的映射關系,接著調用 _fixupParents(創建的打印器實例)類實例方法,_fixupChildren(PlaceHolder類實例--根據名稱獲取的日志打印器,新建的日志打印器實例)--為新建日志打印器設置上級日志打印器,為PlaceHolder類實例現有下級PlaceHolder日志打印器實例重新設置上級日志打印器,最后返回該日志打印器。

_fixupParents及_fixupChildren函數源碼分析

# _fixupParents # ...略class Manager(object): # ...略 def _fixupParents(self, alogger): ''' Ensure that there are either loggers or placeholders all the way from the specified logger to the root of the logger hierarchy. ''' name = alogger.name # 獲取日志打印器名稱 i = name.rfind('.') rv = None # 存放alogger日志打印器的上級日志打印器 while (i > 0) and not rv: # 如果名稱中存在英文的點,并且找到上級日志打印器 substr = name[:i] # 獲取名稱中位于最后一個英文的點的左側字符串(暫且稱至為 點分上級) if substr not in self.loggerDict: # 如果 點分上級 不存在日志打印器字典中self.loggerDict[substr] = PlaceHolder(alogger) # 創建PlaceHolder實例作為 點分上級 對應的日志打印器 # 繼續查找點分上級日志打印器 # 注意,這里的PlaceHolder僅是占位用,不是真的打印器,這里為了方便描述,暫且稱之為PlaceHolder日志打印器 else: # 否則obj = self.loggerDict[substr] # 獲取 點分上級 對應的日志打印器if isinstance(obj, Logger): # 如果為Logger實例,如果是,則跳出循環,執行 # 為日志打印器設置上級 rv = objelse: # 否則 assert isinstance(obj, PlaceHolder) # 斷言它為PlaceHolder的實例 obj.append(alogger) # 把日志打印器添加為點分上級對應的PlaceHolder日志打印器實例的下級日志打印器 執行 # 繼續查找點分上級日志打印器 i = name.rfind('.', 0, i - 1) # 繼續查找點分上級日志打印器 if not rv: # 找不到點分上級、或者遍歷完所有點分上級,都沒找到上級日志打印器 rv = self.root # 則 把root日志打印器設置為alogger日志打印器的上級日志打印器 alogger.parent = rv # 為日志打印器設置上級 def _fixupChildren(self, ph, alogger): ''' Ensure that children of the placeholder ph are connected to the specified logger. ''' name = alogger.name # 獲取日志打印器名稱 namelen = len(name) # 獲取日志打印器名稱長度 for c in ph.loggerMap.keys(): # 遍歷獲取的PlaceHolder日志打印器實例的子級日志打印器 #The if means ... if not c.parent.name.startswith(nm) if c.parent.name[:namelen] != name: # 如果PlaceHolder日志打印器實例名稱不以alogger日志打印器名稱為前綴,alogger.parent = c.parent # 那么,設置alogger日志打印器的上級日志打印器為PlaceHolder日志打印器c.parent = alogger # 設置alogger日志打印器為PlaceHolder日志打印器原有下級PlaceHolder日志打印器的上級

結論:日志打印器都是分父子級的,這個父子層級是怎么形成的,參見上述函數代碼注解

到此這篇關于Python日志打印里logging.getLogger源碼分析詳解的文章就介紹到這了,更多相關Python logging.getLogger源碼分析內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 博客-悦享汽车品质生活 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 电车线(用于供电给电车的输电线路)-百科 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 防爆鼓风机-全风-宏丰鼓风机-上海梁瑾机电设备有限公司 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 中医治疗皮肤病_潍坊银康医院「山东」重症皮肤病救治平台 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 517瓜水果特产网|一个专注特产好物的网站 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 |