两种方法实现python操作日志的封装
程序员文章站
2022-03-25 16:26:48
方法1 初始化方法参数说明 name:自定义日志的名字, 默认是root, 但是我这里是使用调用文件的__name__ 作为默认名字 path:生成的日志的文件名 level:日志的级别,我这里把所有的级别都默认设置了level=DEBUG 方法2 使用logging.fileconfig这个模块实 ......
方法1
import logging class log(object): def __init__(self, name=__name__, path='mylog.log', level='debug'): self.__name = name self.__path = path self.__level = level self.__logger = logging.getlogger(self.__name) self.__logger.setlevel(self.__level) def __ini_handler(self): """初始化handler""" stream_handler = logging.streamhandler() file_handler = logging.filehandler(self.__path, encoding='utf-8') return stream_handler, file_handler def __set_handler(self, stream_handler, file_handler, level='debug'): """设置handler级别并添加到logger收集器""" stream_handler.setlevel(level) file_handler.setlevel(level) self.__logger.addhandler(stream_handler) self.__logger.addhandler(file_handler) def __set_formatter(self, stream_handler, file_handler): """设置日志输出格式""" formatter = logging.formatter('%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]' '-%(levelname)s-[日志信息]: %(message)s', datefmt='%a, %d %b %y %h:%m:%s') stream_handler.setformatter(formatter) file_handler.setformatter(formatter) def __close_handler(self, stream_handler, file_handler): """关闭handler""" stream_handler.close() file_handler.close() @property def logger(self): """构造收集器,返回looger""" stream_handler, file_handler = self.__ini_handler() self.__set_handler(stream_handler, file_handler) self.__set_formatter(stream_handler, file_handler) self.__close_handler(stream_handler, file_handler) return self.__logger if __name__ == '__main__': log = log(__name__, 'file.log') logger = log.logger logger.debug('i am a debug message') logger.info('i am a info message') logger.warning('i am a warning message') logger.error('i am a error message') logger.critical('i am a critical message')
初始化方法参数说明
-
name:自定义日志的名字, 默认是root, 但是我这里是使用调用文件的__name__ 作为默认名字
-
path:生成的日志的文件名
-
level:日志的级别,我这里把所有的级别都默认设置了level=debug
方法2
使用logging.fileconfig这个模块实现(不知道这个模块的找度娘恶补一下把)
1.使用配置文件构造日志配置信息
logger.ini
[loggers] keys = root, example01, example02 [logger_root] level = debug handlers = hand01, hand02 [logger_example01] handlers = hand01, hand02 qualname = example01 propagate = 0 [logger_example02] handlers = hand01, hand03 qualname = example02 propagate = 0 [handlers] keys = hand01, hand02, hand03 [handler_hand01] class = streamhandler level = info formatter = form01 args=(sys.stdout, ) [handler_hand02] class = filehandler level = debug formatter = form01 args = ('log/test_case_log.log', 'a') [handler_hand03] class = handlers.rotatingfilehandler level = info formatter = form01 args = ('log/test_case_log.log', 'a', 10*1024*1024,3) [formatters] keys = form01, form02 [formatter_form01] format = %(asctime)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[loginfomessage]: %(message)s datefmt = %a, %d %b %y %h:%m:%s [formatter_form02] format = %(name)-12s: %(levelname)-8s-[日志信息]: %(message)s datefmt = %a, %d %b %y %h:%m:%s
封装python代码
import logging from logging import config class mylog(object): def __init__(self): config.fileconfig('logger.ini') self.logger = logging.getlogger('example01') @property def my_logger(self): return self.logger if __name__ == '__main__': log = mylog() log.my_logger.info('it is my test log message info')
总结
两种方法各有好处吧
第一种代码很好理解思路清晰 , 但是不利于项目都维护,比如日志文件名,日志格式等无法修改,只能通过代码内部修改
第二种其实是使用config模块内部使用配置文件操作模块configparser做了封装, 用配置文件来构造自定义日志器,好处很明显,我们只要通过修改配置文件就能修改日志的格式,名字,级别等等一些设置,无需改动代码,而且使用很简单, 其实这种方法完全不需要封装一个python代码,哪个模块需要输出日志,直接调用config模块获得logger就可以了(就是上面文件的那几行代码
上一篇: 极客沙龙 · 凹凸主播开讲啦
推荐阅读