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
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
- python将logging模块封装成单独模块并实现动态切换Level
- Python的logging模块封装
- python +selenium logging 模块封装
- 【python】Python的logging模块封装
- python模块 ---logging模块
- Python日志模块logging格式化封装
- [Python--] Python logging模块实现邮件报警
- python logging模块学习
- Python标准模块logging
- Python标准模块logging
- python logging模块
- python 之logging模块
- python的logging模块
- Python标准模块logging
- [python相关]logging模块
- Python标准模块logging
- python logging模块学习
- Python标准模块logging
- 微信web开发调试工具
- Java线程池入门
- 细化热敏打印机打印bitmap图片参数
- test
- android-MediaRecorder.OutputFormat
- python将logging模块封装成单独模块并实现动态切换Level
- EasyUI使用tree生成树形结构加载两次的问题
- Notification通知栏设置及其点击响应
- 平台大小端 , 结构体大小-面试题
- IE的layout属性详解
- 最好的8个 Java RESTful 框架
- PL/SQL工具报:无效的窗口句柄
- IO流学习总结
- AFNetworking3.1.0源码分析(七)详解AFHTTPRequestSerializer 之AFStreamingMultipartFormData上