前面第1版写好后,很凌乱,主要的问题在于,Python不支持方法重载,想要灵活创建对象,当时的变通办法是,先链式地有选择地设置属性(方法重载的本质就是有选择地设置属性),再做实例化,这样导致后面创建对象的时候就很凌乱。

然后才知道,Python可以缺省参数,变相做到方法重载

代码:Python3

# -*- coding: utf-8 -*-'''    --封装了logging模块,舍弃了繁琐了设置,仅保留关键设置,美化了输出格式'''import sys,random,time import logging as lgdef 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        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 文件路径 若设置为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 |··|··|··牛逼镇