python将logging模块封装成单独模块并实现动态切换Level

来源:互联网 发布:科勒淘宝商城旗舰店 编辑:程序博客网 时间:2024/06/02 06:25

查找了很多资料,但网上给出的教程都是大同小异的,而我想将代码进一步精简,解耦,想实现如下两个目标

1. 将logging模块的初始化,配置,设置等代码封装到一个模块中;

2. 能根据配置切换logging.level, 网上给出的教程都是写死的,如果我在线上之前使用了logging.info(msg),现在想切换为logging.debug(msg)怎么办?需要能够根据配置文件中的 设置配置logging.level

demo如下:

两个文件:

logging_class:将logging模块的初始化,配置,设置等代码封装到一此模块中,读取配置文件中对于log等级的设置项;需要使用log功能的模块import 这个模块

applogconfig.ini: 配置文件

logging_class:

import loggingimport sysimport ConfigParserdef 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)                #必须设置,否则无法输出        app_log.setLevel(logging.NOTSET)                return app_log    except Exception as e:        logging.shutdown()        raise edef 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内容:

[log]log_level=ERRORdir=log



以下为unittest内容:

import unittestimport logging_classimport osimport loggingclass 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:\Myworkspace\python\logging_module\logging_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:\Myworkspace\python\logging_module\logging_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:\Myworkspace\python\logging_module\logging_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 begin
test end
test begin
test end
test begin
2016-12-15 17:59:04,059 logging_module_test.py[line:48] ERROR dddds
test end
----------------------------------------------------------------------
Ran 3 tests in 0.004s


OK





0 0