当前位置:
首页 > Python基础教程 >
-
python基础教程之python操作日志的封装
前言
曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的, 但是我就是靠着这篇文章入门的logging,所以我觉得没必要再继续说些理论的东西,今天就简单的对日志做个封装,实际工作中直接拿去用吧
方法1
""" ------------------------------------ @Time : 2019/5/22 8:12 @Auth : linux超 @File : logfile.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! ------------------------------------ """ 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代码
""" ------------------------------------ @Time : 2019/5/22 9:37 @Auth : linux超 @File : Log.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! ------------------------------------ """ 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就可以了(就是上面文件的那几行代码),今天就到这吧......
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式