Python練手,封裝日誌模塊,v2
阿新 • • 發佈:2018-01-12
return randint des erro ini alt map 重復 int 前面第1版寫好後,很淩亂,主要的問題在於,Python不支持方法重載,想要靈活創建對象,當時的變通辦法是,先鏈式地有選擇地設置屬性(方法重載的本質就是有選擇地設置屬性),再做實例化,這樣導致後面創建對象的時候就很淩亂。
然後才知道,Python可以缺省參數,變相做到方法重載
代碼:Python3
# -*- coding: utf-8 -*- ''' --封裝了logging模塊,舍棄了繁瑣了設置,僅保留關鍵設置,美化了輸出格式 ''' import sys,random,time import logging as lg def getRandomInt(digits): ''' @args: int digits @returns: string ''' return random.randint(1,10**digits-1).__str__().zfill(digits) def getNowDate(fmt): ''' @args: string fmt @returns: string ''' return time.strftime(fmt,time.localtime()).__str__() def getOriginPath(): ''' @returns: string ''' return sys.argv[0] class XLogger(): ''' -日誌記錄器 -封裝了logging模塊,舍棄了繁瑣了設置,僅保留關鍵設置,美化了輸出格式 -大概用法:-創建XLogger,添加XHandler -對於XLogger -允許設置日誌級別、記錄器名稱、父子記錄器的傳播功能 -對於XStreamHandler 控制臺輸出 -不允許設置 -對於XFileHandler 文件輸出 -允許設置文件路徑,文件寫入方式:覆蓋/追加 ''' levelMap = {'DEBUG':lg.DEBUG, 'INFO':lg.INFO, 'WARN':lg.WARNING, 'ERROR':lg.ERROR, 'CRITICAL':lg.CRITICAL} def __init__(self,name='AUTO',level='INFO',propagate=False): ''' @args: String name 記錄器名稱 (名稱可體現記錄器的父子關系) String level 日誌級別 DEBUG/INFO/WARN/ERROR/CRITICAL String propagate 是否開啟父子日誌記錄器的向上傳播功能 - 若開啟,子記錄器會獲得父記錄器的全部Handler, - 需註意重復添加Handler以免產生重復日誌 ''' self.level = level self.propagate = propagate if name.upper() == 'AUTO' : self.name = getRandomInt(12) else: self.name = name self.logger = lg.getLogger(self.name) self.logger.setLevel(XLogger.levelMap.get(self.level)) self.logger.propagate = self.propagate def addHandler(self,xHandler): self.logger.addHandler(xHandler.handler) return self def debug(self,layer,message): self.logger.debug('DBUG ' + '|··' * layer +message) def info(self,layer,message): self.logger.info('INFO ' + '|··' * layer + message) def warning(self,layer,message): self.logger.warning('WARN ' + '|··' * layer + message) def error(self,layer,message): self.logger.error('ERRO ' + '|··' * layer + message) def critical(self,layer,message): self.logger.critical('CRIT ' + '|··' * layer + message) class XHandler: def __init__(self): self.handler = None self.formatter = lg.Formatter('[%(name)s] %(asctime)s %(message)s','%y/%m/%d %H:%M:%S') class XFileHandler(XHandler): def __init__(self,file='AUTO',model='w'): ''' @args: String file 文件路徑 若設置為AUTO 則日誌文件路徑為:起源執行文件.時間+隨機數+XLOG String model 文件寫入模式 w覆蓋 a追加 ''' XLogger.XHandler.__init__(self) self.model = model if file.upper() == 'AUTO' : self.file = getOriginPath()+'.'+getNowDate("%Y%m%d%H%M%S")+getRandomInt(4)+'XLOG' else: self.file = file self.handler = lg.FileHandler(self.file,mode=self.model.lower(),encoding='UTF-8',delay=False) self.handler.setFormatter(self.formatter) class XStreamHandler(XHandler): def __init__(self): XLogger.XHandler.__init__(self) self.handler = lg.StreamHandler() self.handler.setFormatter(self.formatter)
測試:
dir_='D:\\Users\\ex-hexuwen001\\Desktop\\Work\M1-APPS\\using__apps_data\\eclipse_workspace\\myPython\\src' file1=dir_+'\\1.xlog' file2=dir_+'\\2.xlog' logger1 = XLogger(name='aaaa', level='DEBUG', propagate=True) .addHandler(XLogger.XFileHandler(file=file1, model='w')) .addHandler(XLogger.XStreamHandler()) logger1.debug(0,"牛逼局域網") logger1.info(1,'廣東省') logger1.warning(2,'肇慶市') logger1.error(2,'高要市') logger1.critical(3,'牛逼鎮') logger2 = XLogger(name='aaaa.bbbb', level='DEBUG', propagate=True) .addHandler(XLogger.XFileHandler(file=file2, model='w')) .addHandler(XLogger.XStreamHandler()) logger2.debug(0,"牛逼局域網") logger2.info(1,'廣東省') logger2.warning(2,'肇慶市') logger2.error(2,'高要市') logger2.critical(3,'牛逼鎮')
輸出:
[aaaa] 18/01/12 14:55:04 DBUG 牛逼局域網 [aaaa] 18/01/12 14:55:04 INFO |··廣東省 [aaaa] 18/01/12 14:55:04 WARN |··|··肇慶市 [aaaa] 18/01/12 14:55:04 ERRO |··|··高要市 [aaaa] 18/01/12 14:55:04 CRIT |··|··|··牛逼鎮 [aaaa.bbbb] 18/01/12 14:55:04 DBUG 牛逼局域網 [aaaa.bbbb] 18/01/12 14:55:04 DBUG 牛逼局域網 [aaaa.bbbb] 18/01/12 14:55:04 INFO |··廣東省 [aaaa.bbbb] 18/01/12 14:55:04 INFO |··廣東省 [aaaa.bbbb] 18/01/12 14:55:04 WARN |··|··肇慶市 [aaaa.bbbb] 18/01/12 14:55:04 WARN |··|··肇慶市 [aaaa.bbbb] 18/01/12 14:55:04 ERRO |··|··高要市 [aaaa.bbbb] 18/01/12 14:55:04 ERRO |··|··高要市 [aaaa.bbbb] 18/01/12 14:55:04 CRIT |··|··|··牛逼鎮 [aaaa.bbbb] 18/01/12 14:55:04 CRIT |··|··|··牛逼鎮
Python練手,封裝日誌模塊,v2