如何通过配置文件配置Logging的MemoryHandler并将刷新内容存入变量
Python logging MemoryHandler 日志存入变量实现方案
实现思路
- MemoryHandler本身仅负责日志缓存,需要指定
target参数作为日志flush后的接收处理器 - 自定义一个继承自
logging.Handler的处理器,将收到的日志存入内存列表,即可实现日志转存变量的需求
步骤1:自定义日志存储处理器
该处理器负责接收MemoryHandler flush的日志,格式化后存入内存供后续读取:
import logging class StringBufferHandler(logging.Handler): def __init__(self): super().__init__() self.buffer = [] def emit(self, record): # 将日志记录按配置的格式转成字符串存入缓存 log_msg = self.format(record) self.buffer.append(log_msg) def get_and_clear(self): # 导出所有日志并清空缓存,避免重复读取 content = '\n'.join(self.buffer) self.buffer.clear() return content
步骤2:业务逻辑改造
无需修改你现有的配置文件,通过代码动态给MemoryHandler绑定target即可,完整测试代码如下:
import logging import logging.config # 上面定义的自定义处理器 class StringBufferHandler(logging.Handler): def __init__(self): super().__init__() self.buffer = [] def emit(self, record): log_msg = self.format(record) self.buffer.append(log_msg) def get_and_clear(self): content = '\n'.join(self.buffer) self.buffer.clear() return content # 加载你原有的配置文件 logging.config.fileConfig(fname=r'./logger_config2.conf') # 从root logger中获取MemoryHandler实例 root_logger = logging.getLogger() memory_handler = None for handler in root_logger.handlers: if isinstance(handler, logging.handlers.MemoryHandler): memory_handler = handler break # 初始化自定义存储处理器,绑定为MemoryHandler的target buffer_handler = StringBufferHandler() buffer_handler.setFormatter(memory_handler.formatter) # 复用你配置的格式化规则 memory_handler.target = buffer_handler # 测试日志打印 logging.debug('调试日志') logging.info('普通信息') logging.error('错误信息1') logging.error('错误信息2') # 手动flush缓存并读取日志内容 memory_handler.flush() my_flush_contents = buffer_handler.get_and_clear() # 验证结果 print("获取到的日志内容:") print(my_flush_contents)
可选配置方式(静态绑定target)
如果你希望直接在配置文件中指定target,可以按如下方式修改配置:
[handlers] # 新增自定义handler的key keys=memoryHandler,bufferHandler [handler_bufferHandler] # 替换为你的自定义Handler所在的完整类路径,比如和测试脚本同目录则写 脚本文件名.StringBufferHandler class=test.StringBufferHandler formatter=memoryFormatter args=() [handler_memoryHandler] class=handlers.MemoryHandler formatter=memoryFormatter # args参数新增target配置 args=(10, DEBUG, %(handlers_bufferHandler)s) level=ERROR
该方式需要注意自定义处理器的类路径配置正确,否则加载配置时会报错,更推荐动态绑定的方式,灵活性更高不易出错。
内容的提问来源于stack exchange,提问作者banana_99
相关产品推荐
相关产品推荐

