如何在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
相关产品推荐
相关产品推荐

