自定义Python logging.Handler输出至SimpleGUI多行控件报错排查
自定义logging.Handler时'level'属性缺失问题的解决
问题根源
自定义logging.Handler子类时,必须调用父类logging.Handler的__init__方法。因为Handler基类会初始化level、filters、formatter等核心属性,若跳过这一步,这些属性不会被创建,当logging框架内部尝试访问level时就会抛出AttributeError。
你之前在emit()里只用print()时没报错,是因为这种写法没有触发框架对level属性的校验,但这属于不规范的实现,后续拓展功能时必然会出问题。
错误示例(你的原代码大概是这样)
import logging class OutputHandler(logging.Handler): def emit(self, record): # 用print时未触发框架的level检查,暂时正常 print(record.getMessage())
修正后的代码
import logging class OutputHandler(logging.Handler): def __init__(self, level=logging.NOTSET): # 必须调用父类初始化方法,完成核心属性的创建 super().__init__(level) def emit(self, record): # 这里替换为你的GUI更新逻辑,比如写入文本框 formatted_log = self.format(record) print(formatted_log) # 示例打印,实际改成GUI操作
补充说明
- 如果不需要自定义初始日志级别,也可以直接写
super().__init__(),默认使用logging.NOTSET,后续通过handler.setLevel(logging.INFO)来调整级别。 emit()方法里调用self.format(record)是规范写法,会自动应用你设置的日志格式化器,让日志输出符合预期格式。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

