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

如何在Loguru中限制日志消息长度并显示截断信息?

Python日志消息截断的标准解决方案

一、全局配置层面(自动截断所有日志)

如果希望所有日志消息超过指定长度时自动截断并显示剩余字符数,可以通过自定义logging.Formatter实现,这是Python标准库层面的原生解决方案,无需额外依赖。

自定义Formatter类,重写format方法处理消息截断逻辑:

import logging

class TruncatingFormatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, style='%', max_length=200):
        super().__init__(fmt, datefmt, style)
        self.max_length = max_length  # 设置允许的最大消息长度

    def format(self, record):
        original_msg = record.getMessage()
        if len(original_msg) > self.max_length:
            # 截断消息并拼接剩余字符数提示
            truncated_content = original_msg[:self.max_length]
            remaining_chars = len(original_msg) - self.max_length
            record.msg = f"{truncated_content} ... (another {remaining_chars} symbols)"
            record.args = ()  # 重置args,避免原消息的格式化逻辑干扰
        return super().format(record)

# 配置日志使用自定义Formatter
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

console_handler = logging.StreamHandler()
# 配置格式、时间格式和最大截断长度
formatter = TruncatingFormatter(
    fmt='%(asctime)s %(levelname)s: %(message)s',
    datefmt='%H:%M',
    max_length=30
)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)

# 测试
big_data = list(range(100))
logger.info(f"Received data: {big_data}")

运行后输出示例:

11:20 INFO: Received data: [1, 2, 3, ... (another 100 symbols)

二、调用层面(按需截断指定日志)

如果只需要对部分日志做截断处理,其他日志保持原样,可以通过工具函数或给Logger添加自定义方法实现,灵活性更高。

方式1:工具函数封装

import logging

# 基础日志配置
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%H:%M'))
logger.addHandler(handler)

def truncated_log(logger_func, msg, max_length=200):
    """按需截断日志消息的工具函数"""
    if len(msg) > max_length:
        truncated = msg[:max_length]
        remaining = len(msg) - max_length
        logger_func(f"{truncated} ... (another {remaining} symbols)")
    else:
        logger_func(msg)

# 用法示例
big_data = list(range(100))
# 需要截断的日志用工具函数调用
truncated_log(logger.info, f"Received data: {big_data}", max_length=30)
# 普通日志直接用原方法
logger.info("This is a normal short message")

方式2:给Logger添加自定义方法

给logging.Logger类动态添加自定义方法,让调用更自然:

import logging

def truncated_info(self, msg, max_length=200):
    """自定义的截断info日志方法"""
    if len(msg) > max_length:
        truncated = msg[:max_length]
        remaining = len(msg) - max_length
        self.info(f"{truncated} ... (another {remaining} symbols)")
    else:
        self.info(msg)

# 给Logger类添加自定义方法
logging.Logger.truncated_info = truncated_info

# 基础日志配置
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%H:%M'))
logger.addHandler(handler)

# 用法示例
big_data = list(range(100))
# 调用自定义方法实现截断
logger.truncated_info(f"Received data: {big_data}", max_length=30)
# 普通info日志正常使用
logger.info("Short message without truncation")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:29