我有从Python的日志记录模块生成的日志文件,该模块在行中间使用省略号进行截断,大约为159个字符,如果算上换行,则为160个字符。
一开始,我以为是VSCode在做截断。文件已加载到记事本中,行的宽度相同。这些行很可能被Python的日志模块截断了。
日志模块设置:
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扩展。有哪些选项可以将此行扩展到其全宽以显示日志的所有详细信息?
[2022-10-22T01:47:04] DEBUG [websockets.client.read_frame:1152] < TEXT '{"type":"message","topic":"/spotMarket/level2De...estamp":1666428417709}}' [394 bytes]
VSCode中的以下设置没有产生影响:
"editor.stopRenderingLineAfter":-1
更新:
我想知道Python的日志记录是否正在重新格式化字符串。Python的websockets中生成截断行的函数位于:
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((语句用于打印出"框架"(用<<表示(。
TEXT '{"type": "subscribe", "topic": "/spotMarket/lev...privateChannel": false}' [1063 bytes]
结果看起来类似地被截断了!
这些行很可能被Python的日志模块截断了。
这不是开箱即用的logging
功能的一部分;如果它不是编辑器的工件,那么很可能配置了具有换行行为的Formatter
。
根据我在原始帖子中发布的更新内容,我研究了Frame对象的代码。文件位于:
C:UsersThomasAppDataLocalProgramsPythonPython310Libsite-packageswebsocketsframes.py
有一个函数可以返回字符串,使框架对象可读:
def __str__(self) -> str:
"""
Return a human-readable representation of a frame.
"""
在函数的末尾,找到了截断数据的代码:
if len(data) > 75:
data = data[:48] + "..." + data[-24:] <---<<< here
metadata = ", ".join(filter(None, [coding, length, non_final]))
return f"{self.opcode.name} {data} [{metadata}]"
总之,帧对象在转换为字符串时会被截断,并且它太大。Python的日志记录和VSCode并不是进行截断的。