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

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

如何理解python接口自動化之logging日志模塊

瀏覽:3日期:2022-06-16 16:04:41
目錄一、logging模塊介紹二、日志等級三、日志收集器四、日志處理器五、日志過濾器六、日志格式器七、日志滾動八、模塊封裝一、logging模塊介紹

​前言:我們之前運行代碼時都是將日志直接輸出到控制臺,而實際項目中常常需要把日志存儲到文件,便于查閱,如運行時間、描述信息以及錯誤或者異常發生時候的特定上下文信息。

​Python中自帶的logging模塊提供了標準的日志接口,在debug時使用往往會事半功倍。為什么不直接使用print去輸出呢?這種方式對簡單的腳本來說有用,對于復雜的系統來說相當于一個花瓶擺設,大量的print輸出很容易被遺忘在代碼里,并且print是標準輸出,這很難從一堆信息里去判斷哪些是你需要重點關注的。

​logging的優勢就在于可以控制日志的級別,把不需要的信息進行過濾,且可以決定它輸出到什么地方、如何輸出,還可以通過控制等級把特定等級的信息輸出到特定的位置等。logging一共分為四個部分:

Loggers:日志收集器,可供程序直接調用的接口,app通過調用提供的api來記錄日志 Handlers:日志處理器, 決定將日志記錄分配至正確的目的地 Filters:日志過濾器,對日志信息進行過濾, 提供更細粒度的日志是否輸出的判斷 Formatters:日志格式器,制定最終記錄打印的格式布局二、日志等級

​logging將logger的等級劃分成5個level,由低到高分別是DEBUG、INFO、WARNING、ERROE、CRITICAL,默認是WARNING級別,CRITICAL最高,相關等級說明如下:

Level 說明 DEBUG 輸出詳細的運行信息,主要用于調試,追蹤問題時使用 INFO 輸出正常的運行的信息,一切按預期進行的情況 WARNING 一些意想不到的或即將會發生的情況,比如警告:內存空間不足,但不影響程序運行 ERROR 由于某些問題,程序的一些功能會受到影響,還可以繼續運行 CRITICAL 一個嚴重的錯誤,表明程序本身可能無法繼續運行

​這些等級的日志中低包含高,比如INFO,會收集INFO及以上等級的日志,DEBUG等級的日志將不進行收集。下面我們來輸出這5個等級的日志:

import logging'''logging模塊默認收集的日志是warning以上等級的'''a = 100logging.debug(a)logging.info(’這是INFO等級的信息’)logging.warning(’這是WARNING等級的信息’)logging.error(’這是ERROR等級的信息’)logging.critical(’這是CRITICAL等級的信息’)

​輸出結果:

C:softwarepythonpython.exe D:/learn/test.py

WARNING:root:這是WARNING等級的信息

ERROR:root:這是ERROR等級的信息

CRITICAL:root:這是CRITICAL等級的信息

Process finished with exit code 0

三、日志收集器

​日志是怎么被收集和輸出的呢?答案就是日志收集器,設置一個收集器,把指等級的日志信息輸出到指定的地方,控制臺或文件等,其工作過程大致如下:

如何理解python接口自動化之logging日志模塊

​logging中默認的日志收集器是root,收集等級默認是WARNING,我們可以通過setLevel來改變它的收集等級。

# 獲取默認的日志收集器rootmy_log = logging.getLogger()# 設置默認的日志收集器等級my_log.setLevel('DEBUG') # 日志將全部被收集a = 100logging.debug(a)logging.info(’這是INFO等級的信息’)logging.warning(’這是WARNING等級的信息’)logging.error(’這是ERROR等級的信息’)logging.critical(’這是CRITICAL等級的信息’)

​輸出結果:

C:softwarepythonpython.exe D:/learn/test.py

DEBUG:root:100

INFO:root:這是INFO等級的信息

WARNING:root:這是WARNING等級的信息

ERROR:root:這是ERROR等級的信息

CRITICAL:root:這是CRITICAL等級的信息

Process finished with exit code 0

​除了使用默認的日志收集器,我們也可以自己創建一個收集器logging.getLogger,如下:

import loggingmy_logger = logging.getLogger(’my_logger’)# 創建logging對象my_logger.setLevel(’INFO’)# 設置日志收集等級a = 100logging.debug(a)logging.info(’這是INFO等級的信息’)logging.warning(’這是WARNING等級的信息’)logging.error(’這是ERROR等級的信息’)logging.critical(’這是CRITICAL等級的信息’)

​輸出結果:

C:softwarepythonpython.exe D:/learn/test.py

WARNING:root:這是WARNING等級的信息

ERROR:root:這是ERROR等級的信息

CRITICAL:root:這是CRITICAL等級的信息

Process finished with exit code 0

四、日志處理器

​上面例子中設置的收集器都是輸出到控制臺,除此我們還可以輸出到文件中。

​Handlers(處理器)的作用就是將logger發過來的信息進行準確地分配,送往正確的地方。比如,送往控制臺、文件或者是兩者。它決定了每個日志收集器的行為,是創建收集器之后需要配置的重點區域。每個Handler同樣有一個日志級別,一個logger可以擁有多個handler也就是說logger可以根據不同的日志級別將日志傳遞給不同的handler。當然也可以相同的級別傳遞給多個handler,這就根據需求來靈活的配置了。

​下面實例中設置了兩個handler,一個是輸出到控制臺,一個是輸出到文件中。關鍵代碼:

logging.StreamHandler:輸出到控制臺的處理器 logging.FileHandler:輸出到文件的處理器 addHandler:添加處理器 removeHandler:移除處理器

import loggingmy_logger = logging.getLogger(’my_logger’)my_logger.setLevel(’INFO’)# 創建一個輸出到控制臺的處理器sh = logging.StreamHandler()sh.setLevel('ERROR') # 設置處理器的輸出等級my_logger.addHandler(sh) # 將處理器綁定到日志收集器上# 創建一個輸出到文件的處理器fh = logging.FileHandler('logs.logs', encoding='utf8')fh.setLevel('INFO')my_logger.addHandler(fh)# my_logger.removeHandler(fh)# 移除處理器a = 100my_logger.debug(a)my_logger.info(’這是INFO等級的信息’)my_logger.warning(’這是WARNING等級的信息’)my_logger.error(’這是ERROR等級的信息’)my_logger.critical(’這是CRITICAL等級的信息’)

運行結果:

C:softwarepythonpython.exe D:/learn/test.py

這是ERROR等級的信息

這是CRITICAL等級的信息

Process finished with exit code 0

如何理解python接口自動化之logging日志模塊

五、日志過濾器

​Filters可以實現比level更復雜的過濾功能,限制只有滿足過濾規則的日志才會被輸出。比如我們定義了filter = logging.Filter(’A.B’),并將這個Filter添加到了一個Handler上,則使用該Handler的Logger中只有名字帶A.B前綴的Logger才能輸出其日志。下面是一個簡單實例:

import logging# 這是logger1my_logger = logging.getLogger(’A.C,B’)my_logger.setLevel(’INFO’)# 這是logger2my_logger2 = logging.getLogger(’A.B’)my_logger2.setLevel(’INFO’)# 創建一個處理器,兩個logger都使用這個處理器sh = logging.StreamHandler()sh.setLevel('ERROR')my_logger.addHandler(sh)my_logger2.addHandler(sh)# 創建一個過濾器綁到處理器上my_filter = logging.Filter(name=’A.B’)sh.addFilter(my_filter) # 把過濾器添加到處理器上# sh2.removeFilter(my_filter) # 移除過濾器my_logger.debug(’這是logger1-DEBUG等級的信息’)my_logger.info(’這是logger1-INFO等級的信息’)my_logger.warning(’這是logger1-WARNING等級的信息’)my_logger.error(’這是logger1-ERROR等級的信息’)my_logger.critical(’這是logger1-CRITICAL等級的信息’)my_logger2.debug(’這是logger2-DEBUG等級的信息’)my_logger2.info(’這是logger2-INFO等級的信息’)my_logger2.warning(’這是logger2-WARNING等級的信息’)my_logger2.error(’這是logger2-ERROR等級的信息’)my_logger2.critical(’這是logger2-CRITICAL等級的信息’)

​因為只有logger2滿足過濾器的條件,因此只會輸出logger2的日志,運行結果如下:

C:softwarepythonpython.exe D:/learn/test.py

這是logger2-ERROR等級的信息

這是logger2-CRITICAL等級的信息

Process finished with exit code 0

​filter方法用于具體控制傳遞的record記錄是否能通過過濾,如果該方法返回值為0表示不能通過過濾,非0表示可以通過過濾。

六、日志格式器

​顧名思義,對日志進行格式化,因為常規的日志輸出并不直觀美觀,通過美化日志的輸出格式,可以讓我們閱讀起來更加舒服。

​format常用格式如下:

%(name)s: 打印收集器名稱 %(levelno)s: 打印日志級別的數值 %(levelname)s: 打印日志級別名稱 %(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0] %(filename)s: 打印當前執行程序名 %(funcName)s: 打印日志的當前函數 %(lineno)d: 打印日志的當前行號 %(asctime)s: 打印日志的時間 %(thread)d: 打印線程ID %(threadName)s: 打印線程名稱 %(process)d: 打印進程ID %(message)s: 打印日志信息

import loggingmy_logger = logging.getLogger(’A.C,B’)my_logger.setLevel(’INFO’)# 創建一個處理器sh = logging.StreamHandler()sh.setLevel('ERROR')my_logger.addHandler(sh)# 設置一個格式,并設置到處理器上formatter = logging.Formatter(’%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s’)sh.setFormatter(formatter)my_logger.debug(’這是logger1-DEBUG等級的信息’)my_logger.info(’這是logger1-INFO等級的信息’)my_logger.warning(’這是logger1-WARNING等級的信息’)my_logger.error(’這是logger1-ERROR等級的信息’)my_logger.critical(’這是logger1-CRITICAL等級的信息’)

​運行結果:

C:softwarepythonpython.exe D:/learn/test.py

2020-08-01 18:28:43,645 - [test.py-->line:17] - ERROR: 這是logger1-ERROR等級的信息

2020-08-01 18:28:43,645 - [test.py-->line:18] - CRITICAL: 這是logger1-CRITICAL等級的信息

Process finished with exit code 0

七、日志滾動

​如果你用 FileHandler 存儲日志,文件的大小會隨著時間推移而不斷增大,最終有一天它會占滿你所有的磁盤空間。Python 的 logging 模塊提供了兩個支持日志滾動的 FileHandler 類,分別是 RotatingFileHandler 和 TimedRotatingFileHandler,它就可以解決這個尷尬的問題。

RotatingFileHandler 的滾動時刻是日志文件的大小達到一定值,當達到指定值的時候,RotatingFileHandler會將日志文件重命名存檔,然后打開一個新的日志文件。 TimedRotatingFileHandler 是當某個時刻到來時就進行滾動,同 RotatingFileHandler 一樣,當滾動時機來臨時,TimedRotatingFileHandler 會將日志文件重命名存檔,然后打開一個新的日志文件。

​在實際應用中,我們通常會根據時間進行滾動,以下實例也以時間滾動為例,按大小滾動的同理:

import loggingfrom logging.handlers import TimedRotatingFileHandlermy_logger = logging.getLogger(’A.C,B’)my_logger.setLevel(’INFO’)# 創建一個處理器,使用時間滾動的文件處理器log_file_handler = TimedRotatingFileHandler(filename=’log.log’, when=’D’, interval=1, backupCount=10)# log_file_handler.suffix = '%Y-%m-%d'# log_file_handler.extMatch = re.compile(r'^d{4}-d{2}-d{2}.log$')log_file_handler.setLevel('ERROR')my_logger.addHandler(log_file_handler)# 設置一個格式,并設置到處理器上formatter = logging.Formatter(’%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s’)log_file_handler.setFormatter(formatter)my_logger.debug(’這是logger1-DEBUG等級的信息’)my_logger.info(’這是logger1-INFO等級的信息’)my_logger.warning(’這是logger1-WARNING等級的信息’)my_logger.error(’這是logger1-ERROR等級的信息’)my_logger.critical(’這是logger1-CRITICAL等級的信息’)

​參數說明:

filename:日志文件名;

when:是一個字符串,用于描述滾動周期的基本單位,字符串的值及意義如下:

S - Seconds M - Minutes H - Hours D - Days midnight - roll over at midnight W{0-6} - roll over on a certain day; 0 - Monday

interval: 滾動周期,單位由when指定,比如:when=’D’,interval=1,表示每天產生一個日志文件;

backupCount: 表示日志文件的保留個數;

​除了上述參數之外,TimedRotatingFileHandler還有兩個比較重要的成員變量,它們分別是suffix和extMatch。suffix是指日志文件名的后綴,suffix中通常帶有格式化的時間字符串,filename和suffix由“.”連接構成文件名(例如:filename='test', suffix='%Y-%m-%d.log',生成的文件名為test.2020-08-01.log。extMatch是一個編譯好的正則表達式,用于匹配日志文件名的后綴,它必須和suffix是匹配的,如果suffix和extMatch匹配不上的話,過期的日志是不會被刪除的。比如,suffix=“%Y-%m-%d.log”, extMatch的只能是re.compile(r'^d{4}-d{2}-d{2}.log$')。默認情況下,在TimedRotatingFileHandler對象初始化時,suffxi和extMatch會根據when的值進行初始化:

S:suffix='%Y-%m-%d_%H-%M-%S',extMatch=r'^d{4}-d{2}-d{2}_d{2}-d{2}-d{2}';M:suffix='%Y-%m-%d_%H-%M',extMatch=r'^d{4}-d{2}-d{2}_d{2}-d{2}';H:suffix='%Y-%m-%d_%H',extMatch=r'^d{4}-d{2}-d{2}_d{2}';D:suffxi='%Y-%m-%d',extMatch=r'^d{4}-d{2}-d{2}';MIDNIGHT:'%Y-%m-%d',extMatch=r'^d{4}-d{2}-d{2}';W:'%Y-%m-%d',extMatch=r'^d{4}-d{2}-d{2}';

​如果對日志文件名沒有特殊要求的話,可以不用設置suffix和extMatch,如果需要,一定要讓它們匹配上。

八、模塊封裝

​一次封裝,一勞永逸,之后直接調用即可,封裝內容按需。

import loggingfrom logging.handlers import TimedRotatingFileHandlerclass MyLogger(object): @staticmethod def create_logger():my_logger = logging.getLogger('my_logger')my_logger.setLevel('DEBUG')# 控制臺處理器stream_handler = logging.StreamHandler()stream_handler.setLevel('ERROR')my_logger.addHandler(stream_handler)# 使用時間滾動的文件處理器log_file_handler = TimedRotatingFileHandler(filename=’log.log’, when=’D’, interval=1, backupCount=10)log_file_handler.setLevel('INFO')my_logger.addHandler(log_file_handler)formatter = logging.Formatter(’%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s’)stream_handler.setFormatter(formatter)log_file_handler.setFormatter(formatter)return my_logger

以上就是如何理解python接口自動化之logging日志模塊的詳細內容,更多關于python 接口自動化 logging日志模塊的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 缝纫客| 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 岩棉切条机厂家_玻璃棉裁条机_水泥基保温板设备-廊坊鹏恒机械 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 房间温控器|LonWorks|海思 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 |