python封装模块_Python练手,封装日志模块,v2
前面第1版寫好后,很凌亂,主要的問題在于,Python不支持方法重載,想要靈活創(chuàng)建對象,當(dāng)時(shí)的變通辦法是,先鏈?zhǔn)降赜羞x擇地設(shè)置屬性(方法重載的本質(zhì)就是有選擇地設(shè)置屬性),再做實(shí)例化,這樣導(dǎo)致后面創(chuàng)建對象的時(shí)候就很凌亂。
然后才知道,Python可以缺省參數(shù),變相做到方法重載
代碼:Python3#?-*-?coding:?utf-8?-*-
'''
--封裝了logging模塊,舍棄了繁瑣了設(shè)置,僅保留關(guān)鍵設(shè)置,美化了輸出格式
'''
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模塊,舍棄了繁瑣了設(shè)置,僅保留關(guān)鍵設(shè)置,美化了輸出格式
-大概用法:-創(chuàng)建XLogger,添加XHandler
-對于XLogger
-允許設(shè)置日志級別、記錄器名稱、父子記錄器的傳播功能
-對于XStreamHandler?控制臺輸出
-不允許設(shè)置
-對于XFileHandler?文件輸出
-允許設(shè)置文件路徑,文件寫入方式:覆蓋/追加
'''
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??記錄器名稱?(名稱可體現(xiàn)記錄器的父子關(guān)系)
String?level?日志級別??DEBUG/INFO/WARN/ERROR/CRITICAL
String?propagate?是否開啟父子日志記錄器的向上傳播功能
-?若開啟,子記錄器會獲得父記錄器的全部Handler,
-?需注意重復(fù)添加Handler以免產(chǎn)生重復(fù)日志
'''
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
print('XLogger?named:?'+self.name)
def?addHandler(self,xHandler):
self.logger.addHandler(xHandler.handler)
if?isinstance(xHandler,XLogger.XFileHandler):
print('XLogger?XFileHandler?file:?'+xHandler.file)
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?文件路徑?若設(shè)置為AUTO?則日志文件路徑為:起源執(zhí)行文件.時(shí)間+隨機(jī)數(shù)+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,"牛逼局域網(wǎng)")
logger1.info(1,'廣東省')
logger1.warning(2,'肇慶市')
logger1.error(2,'高要市')
logger1.critical(3,'牛逼鎮(zhèn)')
logger2?=?XLogger(name='aaaa.bbbb',?level='DEBUG',?propagate=True)\
.addHandler(XLogger.XFileHandler(file=file2,?model='w'))\
.addHandler(XLogger.XStreamHandler())
logger2.debug(0,"牛逼局域網(wǎng)")
logger2.info(1,'廣東省')
logger2.warning(2,'肇慶市')
logger2.error(2,'高要市')
logger2.critical(3,'牛逼鎮(zhèn)')
輸出:[aaaa]?18/01/12?14:55:04?DBUG?牛逼局域網(wǎng)
[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?|··|··|··牛逼鎮(zhèn)
[aaaa.bbbb]?18/01/12?14:55:04?DBUG?牛逼局域網(wǎng)
[aaaa.bbbb]?18/01/12?14:55:04?DBUG?牛逼局域網(wǎng)
[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?|··|··|··牛逼鎮(zhèn)
[aaaa.bbbb]?18/01/12?14:55:04?CRIT?|··|··|··牛逼鎮(zhèn)
總結(jié)
以上是生活随笔為你收集整理的python封装模块_Python练手,封装日志模块,v2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opengl微发展理解
- 下一篇: macOS下安装ipython