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

如何为Python logging库日志消息设置自动换行的最大长度?

Python Logging 实现日志消息自动换行

完全可以实现,核心是通过自定义日志格式化器,在处理日志消息时对过长文本按指定宽度自动换行。

实现方案

  • 自定义继承自 logging.Formatter 的类,重写 formatMessage 方法,在这里完成消息的换行处理。
  • 将自定义格式化器绑定到日志处理器上,替换默认的格式化逻辑。

代码示例

import logging
import textwrap

class WrappingFormatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, style='%', wrap_width=120):
        super().__init__(fmt, datefmt, style)
        self.wrap_width = wrap_width

    def formatMessage(self, record):
        # 获取原始格式化后的完整日志行
        full_msg = super().formatMessage(record)
        # 拆分日志级别前缀与消息内容(匹配"级别 - 内容"的格式)
        if ' - ' in full_msg:
            prefix, content = full_msg.split(' - ', 1)
            # 计算内容部分可使用的宽度:总宽度减去前缀和分隔符的长度
            content_width = self.wrap_width - len(prefix) - 2
            wrapped_content = textwrap.fill(content, width=content_width)
            return f"{prefix} - {wrapped_content}"
        # 若格式不匹配,直接对整个日志行换行
        return textwrap.fill(full_msg, width=self.wrap_width)

# 测试使用
if __name__ == "__main__":
    logger = logging.getLogger("demo_logger")
    logger.setLevel(logging.INFO)

    # 配置控制台处理器
    console_handler = logging.StreamHandler()
    # 指定日志格式并使用自定义格式化器,设置换行宽度为120
    formatter = WrappingFormatter("%(levelname)s - %(message)s", wrap_width=120)
    console_handler.setFormatter(formatter)

    logger.addHandler(console_handler)

    # 发送长日志消息测试
    long_message = "my message is toooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo long"
    logger.info(long_message)

关键说明

  • 使用标准库 textwrap.fill 处理换行,默认会保留完整单词,避免截断;如果需要强制按宽度截断,可改用 textwrap.wrap 后手动拼接。
  • 拆分前缀与内容的逻辑确保日志级别标识(如INFO -)不会被拆分,仅对实际消息内容进行换行,符合你给出的示例效果。
  • 可通过调整 wrap_width 参数自定义换行触发的字符长度。

内容的提问来源于stack exchange,提问作者pgraums

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:39:21