成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

python將logging模塊封裝成單獨模塊并實現動態切換Level方式

瀏覽:138日期:2022-07-25 17:06:01

查找了很多資料,但網上給出的教程都是大同小異的,而我想將代碼進一步精簡,解耦,想實現如下兩個目標

1. 將logging模塊的初始化,配置,設置等代碼封裝到一個模塊中;

2. 能根據配置切換logging.level, 網上給出的教程都是寫死的,如果我在線上之前使用了logging.info(msg),現在想切換為logging.debug(msg)怎么辦?需要能夠根據配置文件中的 設置配置logging.level

兩個文件:

logging_class:將logging模塊的初始化,配置,設置等代碼封裝到一此模塊中,讀取配置文件中對于log等級的設置項;需要使用log功能的模塊import 這個模塊

applogconfig.ini: 配置文件

logging_class:

import loggingimport sysimport ConfigParser def log_building(log_file): try: #set format format_str=logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #create stander output handler crit_hand=logging.StreamHandler(sys.stderr) crit_hand.setFormatter(format_str) #create file handler file_hand=logging.FileHandler(log_file,’a’) file_hand.setFormatter(format_str) app_log=logging.getLogger(__name__) app_log.addHandler(crit_hand) app_log.addHandler(file_hand) #必須設置,否則無法輸出 app_log.setLevel(logging.NOTSET) return app_log except Exception as e: logging.shutdown() raise e def config_file_get(fpath): try: cnf_dict={} cfg=ConfigParser.SafeConfigParser() cfg.read(fpath) for section in cfg.sections(): #將ini中的item組合到字典中,key=section+_option for item in cfg.items(section): key= section+’_’+item[0] value=item[1] if cnf_dict.get(key,None)==None: cnf_dict[key]=value return cnf_dict except Exception as e: raise edef log_level_get(level): DEBUG_LEVEL={’CRITICAL’:logging.CRITICAL,’ERROR’:logging.ERROR,’WARNING’:logging.WARNING, ’INFO’:logging.INFO,’DEBUG’:logging.DEBUG } try: return DEBUG_LEVEL.get(level.upper()) except Exception as e: raise e

applogconfig.ini內容:

[log]log_level=ERRORdir=log

以下為unittest內容:

import unittestimport logging_classimport osimport logging class Test(unittest.TestCase): cfg={} def setUp(self): print ’test begin’ self.cfg={} def tearDown(self): print ’test end’ def testlog_level_get(self): currentWorkingPath = r’E:Myworkspacepythonlogging_modulelogging_module’ ini_file=os.path.normpath(os.path.abspath(os.path.join(currentWorkingPath,’applogconfig.ini’))) self.cfg=logging_class.config_file_get(ini_file) self.assertEqual(self.cfg[’log_log_level’].upper(), ’ERROR’, ’OK’) def testlog_level_set(self): currentWorkingPath = r’E:Myworkspacepythonlogging_modulelogging_module’ ini_file=os.path.normpath(os.path.abspath(os.path.join(currentWorkingPath,’applogconfig.ini’))) self.cfg=logging_class.config_file_get(ini_file) #print self.cfg[’log_log_level’] self.assertEqual(logging_class.log_level_get(self.cfg[’log_log_level’]), logging.ERROR, ’OK’) def testlog_building(self): currentWorkingPath = r’E:Myworkspacepythonlogging_modulelogging_module’ ini_file=os.path.normpath(os.path.abspath(os.path.join(currentWorkingPath,’applogconfig.ini’))) log_file=os.path.normpath(os.path.abspath(os.path.join(currentWorkingPath,’b.log’))) self.cfg=logging_class.config_file_get(ini_file) #print self.cfg[’log_log_level’] level=logging_class.log_level_get(self.cfg[’log_log_level’]) log=logging_class.log_building(log_file) log.log(level, ’dddds’) log.debug(’msg’) if __name__ == '__main__': #import sys;sys.argv = [’’, ’Test.testName’] unittest.main()

輸出:

Finding files... done.Importing test modules ... done.test begintest endtest begintest endtest begin2016-12-15 17:59:04,059 logging_module_test.py[line:48] ERROR ddddstest end----------------------------------------------------------------------Ran 3 tests in 0.004s

補充知識:一種logging封裝方法,不會產生重復log

在調試logging的封裝的時候,發現已經調用了logging封裝的函數,在被其它函數再調用時,會出現重復的logging。原因是不同的地方創建了不同的handler,所以會重復,可以使用暴力方法解決

暴力方式就是每次創建新的對象就清空logger.handlers

我常用的封裝如下

import loggingimport time,os’’’ 使用方法: import mylog log = mylog.Log().getlog() log.debug('###')’’’class Log(): def __init__(self,logger='mylog'): self.logger = logging.getLogger(logger) self.logger.setLevel(logging.DEBUG) self.log_time = ''+time.strftime('%Y-%m-%d_%H_%M', time.localtime())+'.log' # 在進程路徑創建log文件夾 # self.log_path = os.path.join(os.getcwd() + 'log') # 固定在mylog上一級創建 self.log_path = os.path.join(os.path.dirname(os.path.dirname(__file__)) + 'log') if os.path.exists(self.log_path) and os.path.isdir(self.log_path): pass else: os.makedirs(self.log_path) self.log_name = os.path.join(self.log_path + self.log_time) #因為多出調用logger會生成多個handlers,所以每次調用清空handler self.logger.handlers = [] fh = logging.FileHandler(self.log_name, ’a’, encoding=’utf-8’) formatter = logging.Formatter(’[%(levelname)s][%(asctime)s] [%(filename)s]->[%(funcName)s] line:%(lineno)d ---> %(message)s’) fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) self.logger.addHandler(fh) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) fh.close() def getlog(self): return self.loggerif __name__ == '__main__': log = Log().getlog() log.debug('hello')

以上這篇python將logging模塊封裝成單獨模塊并實現動態切換Level方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美一级专区免费大片| 2022国产精品视频| 亚洲va欧美va天堂v国产综合| 亚洲国产一区二区三区| 美女久久久精品| 成人免费视频视频| 亚洲手机视频| 中国女人久久久| 91久久精品一区二区二区| 欧美一区二区三区影视| 蜜桃av一区二区三区电影| 欧美一级久久| 91精品国产欧美一区二区18| 久久99久久99| 欧美女人交a| 久久视频一区| 久久午夜电影网| 国产精品一级片在线观看| 欧美午夜免费| 欧美日韩中文字幕一区二区| 国产日韩亚洲欧美综合| 日韩精品一二三区| 成人av手机在线观看| 一区二区黄色| 综合色天天鬼久久鬼色| 精品中文字幕一区二区| 欧美中文字幕一区二区三区亚洲| 久久久久成人黄色影片| 日本美女一区二区三区| 欧美日韩亚洲一区在线观看| 国产日韩欧美不卡| 国产一区二区无遮挡| 欧美日韩国产影片| **性色生活片久久毛片| 国产精品夜夜爽| 欧美一级二级三级蜜桃| 亚洲国产精品人人做人人爽| 久久av在线| 日产国产欧美视频一区精品| 欧洲一区二区三区在线| 久久99精品视频| 91精品国产免费久久综合| 国产精品亚洲综合一区在线观看| 欧美一级日韩免费不卡| hitomi一区二区三区精品| 免费精品视频| 日本成人中文字幕| 精品视频在线免费看| 国产成人亚洲综合a∨婷婷| 久久本道综合色狠狠五月| 亚洲chinese男男1069| 一本到一区二区三区| 中文字幕av一区二区三区免费看| 国产精品正在播放| 精品久久久久久久人人人人传媒| 蜜臀久久99精品久久久画质超高清| 欧美日韩精品一区二区三区蜜桃| 粉嫩高潮美女一区二区三区| 欧美亚男人的天堂| 亚洲一区二区偷拍精品| 欧美一区免费视频| 制服.丝袜.亚洲.另类.中文| 日韩中文字幕av电影| 精品污污网站免费看| 国产.精品.日韩.另类.中文.在线.播放| 2024国产精品| 亚洲日本免费| 国产欧美日韩在线视频| 在线播放不卡| 国产精品久久久99| 91亚洲国产成人精品一区二区三| 欧美日韩视频不卡| 99热这里都是精品| 亚洲黄色片在线观看| 好吊一区二区三区| 亚洲国产成人av| 欧美日本免费一区二区三区| 成人av网站在线| 亚洲黄色录像片| 欧美日韩成人综合| 欧美日韩综合网| 日韩精品一卡二卡三卡四卡无卡 | 欧美一区二区三区性视频| 欧美日韩午夜| 日韩电影在线观看一区| 精品国产乱码久久久久久浪潮| 激情成人综合网| 欧美亚洲精品一区| 91在线一区二区三区| 久久综合久久久久88| 亚洲另类自拍| 亚洲欧洲成人av每日更新| 一本久久精品一区二区| av日韩在线网站| 亚洲国产视频直播| 欧美sm极限捆绑bd| 国产偷久久久精品专区| 亚洲摸摸操操av| 影音先锋在线一区| 久久精品免费看| 欧美伊人精品成人久久综合97| 成年人国产精品| 亚洲综合999| 欧美成人vps| 久久免费黄色| 欧美日韩理论| 久久69国产一区二区蜜臀| 中文在线一区二区| 欧美日韩亚洲国产综合| 亚洲午夜精品一区二区| 国产精品原创巨作av| 一区二区三区四区av| 欧美亚洲网站| 99久精品国产| 日韩国产精品大片| 亚洲欧美自拍偷拍| 欧美刺激脚交jootjob| 新67194成人永久网站| 972aa.com艺术欧美| 免费人成黄页网站在线一区二区| 欧美乱妇20p| 粉嫩av亚洲一区二区图片| 亚洲国产成人高清精品| 中文字幕乱码亚洲精品一区 | 亚洲视频一二三| 日韩美女在线视频| 欧美一区91| 蜜桃av噜噜一区| 亚洲你懂的在线视频| 精品乱人伦一区二区三区| 欧美影院一区二区| 一区二区三区导航| 欧美激情国产日韩| 国产福利91精品一区二区三区| 亚洲第一精品在线| 国产精品色眯眯| 亚洲在线国产日韩欧美| 麻豆国产精品官网| 一区二区三区视频在线看| 国产目拍亚洲精品99久久精品| 日韩欧美在线网站| 欧美性猛交xxxx黑人交 | 精品乱人伦小说| 在线不卡中文字幕| 色爱区综合激月婷婷| 国产欧美高清| 欧美亚州在线观看| 99久久伊人久久99| 国内精品久久久久影院一蜜桃| 亚洲永久免费视频| 国产精品国产馆在线真实露脸 | 日韩三级视频在线观看| 欧美中文一区二区三区| 国产精品久久亚洲7777| 国产在线视频欧美一区二区三区| 99国产精品国产精品毛片| 国产精品一区二区在线观看网站| 麻豆视频一区二区| 日本va欧美va欧美va精品| 一区二区三区欧美| 亚洲欧美在线高清| 欧美激情综合网| 欧美精品一区二| 欧美电影免费观看高清完整版在| 欧美日韩日日骚| 欧美日韩一区 二区 三区 久久精品| 色一情一乱一乱一91av| 久久国产欧美| youjizz久久| 国产成人精品www牛牛影视| 精品一区二区三区日韩| 日本不卡高清视频| 日本欧美久久久久免费播放网| 午夜av一区二区| 久久久久久久久久久99999| 91精品国产欧美日韩| 欧美日韩国产片| 欧美性xxxxxxxx| 欧美日韩一区二区三区在线| 欧美日韩国产一级二级| 欧美日韩精品久久久| 欧美日韩一区二区电影| 欧美日本韩国一区二区三区视频 | 亚洲精品在线免费播放| 日韩免费视频一区| 欧美不卡一二三| 久久综合狠狠综合久久激情| 久久午夜电影网| 久久久久国产精品人| 中文字幕第一区第二区| 国产精品久久久久久久久图文区| 亚洲欧美综合另类在线卡通| 一区二区三区自拍| 亚洲成精国产精品女| 天使萌一区二区三区免费观看| 美女视频黄久久| 国产一区二三区好的| 曰韩精品一区二区| 一区二区三区四区五区视频在线观看 | 日韩亚洲欧美精品|