pyppeteer开启DEBUG日志运行失败,如何正确输出完整请求且保证代码可用
问题解答
1. 正确配置日志同时保证代码正常运行
你之前的代码报错是因为logging.basicConfig(level=logging.DEBUG)修改了全局根日志器的级别,会把websockets库的底层调试日志也一并开启,websockets部分调试日志的输出时机和pyppeteer的连接关闭逻辑冲突,导致连接异常报错。
正确的配置方式是仅针对需要的pyppeteer日志器单独配置,不修改全局根日志器,示例代码如下:
import asyncio from pyppeteer import launch import logging # 仅配置pyppeteer连接相关的日志器 pyppeteer_conn_logger = logging.getLogger('pyppeteer.connection') pyppeteer_conn_logger.setLevel(logging.DEBUG) # 添加独立的控制台输出处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter('[%(levelname)s:%(name)s] %(message)s')) pyppeteer_conn_logger.addHandler(console_handler) # 禁止日志向上传播到根日志器,避免和其他模块的日志配置冲突 pyppeteer_conn_logger.propagate = False async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') await page.screenshot({'path': 'example.png'}) await browser.close() asyncio.get_event_loop().run_until_complete(main())
这样既可以打印pyppeteer的请求/响应日志,也不会触发连接异常的问题。
2. 完整展示websocket请求内容,避免截断
websockets库默认会对长度超过阈值的消息内容做截断处理,有两种解决方式:
方式一:修改websockets库的截断阈值
在导入任何依赖websockets的模块前,设置环境变量调整最大允许打印的消息长度:
import os # 单位为字节,这里设置为1MB,可根据需求调整 os.environ['WEBSOCKETS_DEBUG_MAX_PAYLOAD_SIZE'] = '1048576' # 再导入后续模块 import asyncio from pyppeteer import launch import logging
方式二:自行监听pyppeteer连接事件打印完整消息
如果不想修改环境变量,可以直接hook pyppeteer的收发消息方法,自行打印完整内容,不受websockets日志的截断规则限制:
from pyppeteer.connection import Connection # hook发送逻辑,打印完整请求 original_send = Connection.send async def patched_send(self, msg, *args, **kwargs): print(f"[SEND FULL] {msg}") return await original_send(self, msg, *args, **kwargs) Connection.send = patched_send # hook接收逻辑,打印完整响应 original_recv = Connection._recv async def patched_recv(self, *args, **kwargs): msg = await original_recv(self, *args, **kwargs) print(f"[RECV FULL] {msg}") return msg Connection._recv = patched_recv
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

