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

如何展开Python日志中被中间截断(带省略号)的日志行?

问题:Python日志行被截断,如何查看完整日志内容

现象

Python logging模块生成的日志行在中间位置被截断并添加省略号,长度约159字符(含换行则为160字符)。起初怀疑是VSCode导致,但用记事本打开后行宽一致,推测问题出在Python代码或依赖库层面。

当前logging配置

import logging as log
from logging.handlers import RotatingFileHandler

log.basicConfig(
        handlers=[RotatingFileHandler('./logs/kucoin_bot.log', maxBytes=100000, backupCount=100, encoding='utf-8')],
        level=log.DEBUG,
        format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
        datefmt='%Y-%m-%dT%H:%M:%S')

无效尝试

VSCode中安装了Prettier扩展,设置"editor.stopRenderingLineAfter": -1后无效果。

示例截断日志

[2022-10-22T01:47:04] DEBUG [websockets.client.read_frame:1152] < TEXT '{"type":"message","topic":"/spotMarket/level2De...estamp":1666428417709}}' [394 bytes]

排查更新

排查后确认不是logging格式化字符串的问题,而是Python websockets库的Frame对象在转为字符串时主动做了截断。查看write_frame_sync函数:

def write_frame_sync(self, fin: bool, opcode: int, data: bytes) -> None:
    frame = Frame(fin, Opcode(opcode), data)
    if self.debug:
        self.logger.debug("> %s", frame)
        print(frame) # <<< 手动添加的输出
        frame.write(
        self.transport.write,
        mask=self.is_client,
        extensions=self.extensions,
    )

添加print()输出frame,结果同样被截断:

TEXT '{"type": "subscribe", "topic": "/spotMarket/lev...privateChannel": false}' [1063 bytes]

解决方法

1. 修改websockets库的Frame类字符串逻辑

截断是因为websockets的Frame类的__str__或__repr__方法限制了显示长度。找到该类的对应方法(通常在frames.py文件中),修改截断逻辑:

  • 移除原代码中限制数据显示长度的判断,直接返回完整的data内容

示例修改(以__str__方法为例):

# 原代码可能类似
def __str__(self) -> str:
    max_len = 100
    data_repr = repr(self.data[:max_len])
    if len(self.data) > max_len:
        data_repr += "..."
    return f"{self.opcode.name} {data_repr} [{len(self.data)} bytes]"

# 修改为不截断
def __str__(self) -> str:
    return f"{self.opcode.name} {repr(self.data)} [{len(self.data)} bytes]"

2. 自定义日志输出,绕过Frame的截断

不直接打印frame对象,手动提取完整数据后输出。修改websockets日志调用的代码:

# 替换原代码中的 self.logger.debug("> %s", frame)
# 直接解码并输出完整的data内容
try:
    full_data = frame.data.decode('utf-8')
except UnicodeDecodeError:
    full_data = repr(frame.data)
self.logger.debug("> %s %s [%d bytes]", frame.opcode.name, full_data, len(frame.data))

这样就能输出完整的日志内容,不会被截断。

3. 禁用websockets自带debug日志,自行实现

关闭websockets的debug模式,在需要记录Frame数据的地方,自己编写代码输出完整内容,避免依赖其自带的截断逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:31:06