如何修改FreeSimpleGUI中自定义Logger的输出格式?
解决自定义日志Handler的输出格式问题
你的问题核心是自定义的OutputHandler没有应用日志格式化规则,当前代码直接打印了日志记录对象(record),所以显示的是对象本身的原始信息而非格式化后的日志内容。下面是两种实用的解决方法:
方法一:给Handler绑定Formatter格式化器
通过给自定义Handler设置logging.Formatter,可以灵活定义日志的输出格式(比如包含时间、级别、日志内容等):
import FreeSimpleGUI as sg import logging class OutputHandler(logging.Handler): window: sg.Window def __init__(self, window: sg.Window): super().__init__() self.window = window def emit(self, record): # 用Handler自带的format方法处理日志记录 formatted_msg = self.format(record) self.window["txtLog"].print(formatted_msg) layout = [ [sg.Multiline(default_text="", size=(100, 10), disabled=True, autoscroll=True, key="txtLog")] ] window = sg.Window('Form', layout, finalize=True) outHandler = OutputHandler(window) # 定义日志格式,可根据需求调整字段 formatter = logging.Formatter('%(asctime)s | %(levelname)s | %(message)s') outHandler.setFormatter(formatter) log = logging.getLogger("root") log.setLevel(logging.INFO) log.addHandler(outHandler) i = 0 while True: event, values = window.read(timeout = 1000, timeout_key=sg.TIMEOUT_KEY, close=False) if event == sg.WIN_CLOSED or event == 'Exit': break logging.info("Hello World " + str(i)) i += 1 window.close()
方法二:在emit方法中手动格式化(适用于简单场景)
如果不需要复杂的格式规则,也可以直接在emit方法里拼接需要的日志字段:
def emit(self, record): # 手动拼接格式,示例仅显示级别和消息内容 formatted_msg = f"[{record.levelname}] {record.getMessage()}" self.window["txtLog"].print(formatted_msg)
关于自定义Logger的补充说明
如果你的“自定义Logger”指的是独立于root的Logger(比如logging.getLogger("my_app_logger")),只需做到以下几点就能让它遵循格式:
- 给自定义Logger设置日志级别(默认会继承root的级别)
- 将
outHandler添加到该自定义Logger上 - 确保Handler已绑定Formatter
示例代码:
my_logger = logging.getLogger("my_app_logger") my_logger.setLevel(logging.INFO) my_logger.addHandler(outHandler) # 使用自定义Logger输出日志 my_logger.info("这是自定义Logger的格式化日志")
内容的提问来源于stack exchange,提问作者CacO3
相关产品推荐
相关产品推荐

