代码改变世界

Python - logging模块

2022-03-30 17:12  起个昵称  阅读(21)  评论(0编辑  收藏  举报

在logging模块的基础上,自定义出自己想要的格式

学习记录:

 1 import logging
 2 
 3 
 4 # 收集器名字,默认root
 5 logger = logging.getLogger('自创日志')
 6 # 级别
 7 logger.setLevel(logging.INFO)
 8 # 渠道
 9 stream_handle = logging.StreamHandler()
10 file_handle = logging.FileHandler('log.log', encoding='utf-8')
11 # 内容格式
12 fmt = '%(asctime)s | %(levelname)s | %(pathname)s | line:%(lineno)d | %(message)s'
13 formatter = logging.Formatter(fmt)
14 # 关联渠道和格式
15 stream_handle.setFormatter(formatter)
16 file_handle.setFormatter(formatter)
17 # 设置好的渠道添加到日志收集器上
18 logger.addHandler(stream_handle)
19 logger.addHandler(file_handle)
20 
21 logger.info('test')
22 logger.debug('debug级别')
23 logger.error('error级别')
日志量大时,可以:按时间生成日志文件,按大小生成日志文件
from logging import handlers
RotatingFileHandler() TimedRotatingFileHandler()
日志名字
日志级别(Level):DEBUG、INFO、WARNING、ERROR、CRITICAL(FATAL)
输出渠道(Handler):控制台(StreamHandler)、文件(FileHandler)
日志内容(Formatter):时间 - 哪个文件 - 哪行代码 - 输出内容

 

进行封装

对自定义的MyLogger类进行了实例化,其他模块调用这个类时,直接调用对象使用 logger.xxx()

 1 import logging
 2 
 3 
 4 class MyLogger(logging.Logger):
 5 
 6     def __init__(self, name, level=logging.DEBUG, file=None):
 7         super().__init__(name, level)
 8 
 9         # 输出内容的格式
10         fmt = '%(asctime)s | %(levelname)s | %(pathname)s | line:%(lineno)d | %(message)s'
11         formatter = logging.Formatter(fmt)
12 
13         # 控制台输出设置
14         stream_handle = logging.StreamHandler()
15         stream_handle.setFormatter(formatter)
16         self.addHandler(stream_handle)
17 
18         # 文件输出设置
19         if file:
20             file_handle = logging.FileHandler(file, encoding='utf-8')
21             file_handle.setFormatter(formatter)
22             self.addHandler(file_handle)
23 
24 
25 logger = MyLogger('收集器名字', file='日志文件名称.log')
26 logger.info("test info")  # 测试

优化:某些参数可以写在配置文件,然后读取。这样不同项目可以只改配置文件,而不需要改这个函数里的代码