日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

python將logging模塊封裝成單獨模塊并實現(xiàn)動態(tài)切換Level方式

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

查找了很多資料,但網(wǎng)上給出的教程都是大同小異的,而我想將代碼進(jìn)一步精簡,解耦,想實現(xiàn)如下兩個目標(biāo)

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

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

兩個文件:

logging_class:將logging模塊的初始化,配置,設(shè)置等代碼封裝到一此模塊中,讀取配置文件中對于log等級的設(shè)置項;需要使用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) #必須設(shè)置,否則無法輸出 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內(nèi)容:

[log]log_level=ERRORdir=log

以下為unittest內(nèi)容:

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封裝方法,不會產(chǎn)生重復(fù)log

在調(diào)試logging的封裝的時候,發(fā)現(xiàn)已經(jīng)調(diào)用了logging封裝的函數(shù),在被其它函數(shù)再調(diào)用時,會出現(xiàn)重復(fù)的logging。原因是不同的地方創(chuàng)建了不同的handler,所以會重復(fù),可以使用暴力方法解決

暴力方式就是每次創(chuàng)建新的對象就清空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' # 在進(jìn)程路徑創(chuàng)建log文件夾 # self.log_path = os.path.join(os.getcwd() + 'log') # 固定在mylog上一級創(chuàng)建 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) #因為多出調(diào)用logger會生成多個handlers,所以每次調(diào)用清空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模塊封裝成單獨模塊并實現(xiàn)動態(tài)切換Level方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久av电影| 日韩另类视频| 国产视频欧美| 一区三区视频| 日韩一区欧美二区| 综合激情网...| 欧美视频二区| 国产一区二区视频在线看| 国产一区二区三区视频在线| 精品国产第一福利网站| 欧美日韩中文一区二区| 男人的天堂亚洲一区| 国产精品社区| 国产欧美日韩在线观看视频| 精品久久网站| 欧美不卡高清| 日韩福利视频一区| 国产不卡精品在线| 欧美日韩激情| 日韩不卡手机在线v区| 日本激情一区| 亚洲免费网址| 麻豆91精品视频| 欧美女激情福利| 国产日韩高清一区二区三区在线| 国产精品久久久久久久久妇女| 欧美日韩少妇| 欧美亚洲一区二区三区| 成人看片网站| 日韩av网站在线观看| 日韩欧美精品| 亚洲精品福利| av资源亚洲| 天海翼亚洲一区二区三区| 国产一区国产二区国产三区 | 亚洲制服少妇| 国产精品久一| 尤物网精品视频| 国产高清精品二区| 国产婷婷精品| 国产精品密蕾丝视频下载| 激情婷婷久久| 国产福利亚洲| 亚洲影视一区二区三区| 88xx成人免费观看视频库| 日韩高清电影免费| 尤物精品在线| 日韩av在线播放网址| 色综合视频一区二区三区日韩| 国产一区丝袜| 日韩**一区毛片| 五月综合激情| 日韩国产激情| 欧美黄页在线免费观看| 免费日本视频一区| 日韩大片在线播放| 国产欧美69| 综合亚洲自拍| 91精品电影| 日韩大片在线| 你懂的亚洲视频| 亚洲精品护士| 偷拍欧美精品| 日韩成人亚洲| 国产一区丝袜| 国产剧情一区二区在线观看| 免播放器亚洲| 亚洲高清成人| 久久婷婷激情| 日韩中文影院| 精品视频91| 国产精品一二| 欧美日韩一视频区二区| 日韩在线网址| 日韩欧美另类中文字幕| 爽好久久久欧美精品| 欧美~级网站不卡| 激情亚洲影院在线观看| 丁香婷婷久久| 美女视频黄久久| 国产精品网站在线看| 日本免费新一区视频| 视频一区在线播放| 免费精品视频| 先锋亚洲精品| 91久久黄色| 精品91久久久久| 中文欧美日韩| 丝袜美腿亚洲色图| 亚洲一区欧美二区| 亚洲自啪免费| 亚洲精选成人| 日韩二区在线观看| 国产欧美一区| 久久不见久久见免费视频7| 国产伦乱精品| 久久99国产精品视频| 激情不卡一区二区三区视频在线| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美一级精品| 激情五月综合网| 中文欧美日韩| 日韩影院精彩在线| 亚洲三级视频| 日韩欧美中文字幕一区二区三区 | 超碰在线99| 久久激情网站| 亚洲少妇诱惑| 日本aⅴ免费视频一区二区三区| 欧美在线精品一区| 精品亚洲成人| 久久高清免费| 国产模特精品视频久久久久| 一区二区三区午夜视频| 青草国产精品| 国际精品欧美精品| 亚洲不卡av不卡一区二区| 在线综合亚洲| 欧美日韩xxxx| 成人在线视频中文字幕| 另类中文字幕国产精品| 久久高清国产| 久久不见久久见国语| 亚洲成av人片一区二区密柚| 日韩专区欧美专区| 久久久久黄色| 五月天综合网站| 欧美视频一区| 国产麻豆久久| 日韩精品免费一区二区夜夜嗨| 国产精品久久久久9999高清| 日韩视频网站在线观看| 蜜桃视频一区二区三区在线观看 | 欧美亚洲免费| 欧洲一区二区三区精品| 丝袜亚洲精品中文字幕一区| 国产精品久久久免费| 99视频精品全部免费在线视频| 日本一区二区三区视频在线看| 精品亚洲二区| 石原莉奈一区二区三区在线观看| 777久久精品| 欧美黄色网页| 亚洲精品欧洲| 激情亚洲影院在线观看| 亚洲aa在线| 日韩和的一区二在线| 日欧美一区二区| 黑人精品一区| 亚洲欧美网站在线观看| 日韩高清成人| 日韩国产在线一| 久久九九99| 欧美精品aa| 蜜桃av一区二区三区电影| 97精品国产| 久久精品av麻豆的观看方式| 精品一区三区| 久久香蕉网站| 日韩在线一区二区| 国产福利片在线观看| 日本少妇精品亚洲第一区| 久久国产免费| 日韩激情一二三区| 亚洲婷婷免费| 卡一卡二国产精品| 最新日韩av| 桃色一区二区| 精品一区二区三区中文字幕视频 | 国产偷自视频区视频一区二区| 国产一区二区三区精品在线观看| 亚洲一级大片| 黑丝一区二区| 少妇精品导航| 福利在线免费视频| 国产精品xvideos88| 午夜久久福利| 99久久精品国产亚洲精品| 日韩88av| 精品三级av| 国产精品久久久一区二区| 免费一区二区视频| 欧美日韩国产亚洲一区| av亚洲一区二区三区| 粉嫩av一区二区三区四区五区| 欧美午夜三级| 日本成人在线不卡视频| 免费不卡在线观看| 免费av一区| 国产综合亚洲精品一区二| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 男女男精品网站| 欧美特黄视频| 黑丝一区二区| 亚洲美洲欧洲综合国产一区| 一区二区小说| 国产精品av一区二区| 999国产精品| 亚洲福利久久| 欧美丝袜一区|