1. 程式人生 > >Python練手,封裝日誌模塊,v2

Python練手,封裝日誌模塊,v2

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