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

