You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过配置文件配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:45:00