如何保存他人网站的console.log信息并解决对象显示[object Object]问题
解决方案
方案1:替换页面console原生方法(通过Tampermonkey脚本实现,无需修改原有Chrome启动逻辑)
- 给目标站点注入Tampermonkey脚本,在页面加载前重写console系列方法,把所有参数提前序列化为JSON字符串后再输出,脚本示例如下:
// ==UserScript== // @name 控制台对象序列化输出 // @match *://你需要采集日志的站点域名/* // @grant none // @run-at document-start // ==/UserScript== const originalConsole = {...console}; ['log', 'info', 'warn', 'error', 'debug'].forEach(method => { console[method] = (...args) => { const serializedArgs = args.map(arg => { if (typeof arg === 'object' && arg !== null) { try { // 支持序列化普通对象,可根据需求调整缩进参数 return JSON.stringify(arg, null, 2); } catch (e) { return `[不可序列化对象: ${e.message}]`; } } return arg; }); originalConsole[method].apply(console, serializedArgs); }; });
- 启动Chrome时仍保留
--enable-logging --v=1参数,此时输出到本地日志的对象就会是格式化后的JSON字符串,不会再显示[object Object]。
方案2:使用Chrome DevTools协议自主采集日志(适合自动化批量采集场景)
- 启动Chrome时追加远程调试参数:
chrome.exe --enable-logging --v=1 --remote-debugging-port=9222 - 编写自定义脚本连接9222调试端口,订阅
Runtime.consoleAPICalled事件,收到事件后直接把所有参数序列化存入本地文件,示例Node.js核心代码如下:
const CDP = require('chrome-remote-interface'); const fs = require('fs'); async function collectConsoleLogs() { const client = await CDP({port: 9222}); const {Runtime} = client; await Runtime.enable(); // 监听控制台输出事件 Runtime.consoleAPICalled(({type, args, timestamp}) => { const logItem = { logType: type, time: new Date(timestamp).toISOString(), content: args.map(arg => arg.value ?? arg.description ?? JSON.stringify(arg)) }; // 追加写入本地日志文件 fs.appendFileSync('./custom-console.log', JSON.stringify(logItem) + '\n'); }); } collectConsoleLogs();
- 该方案不需要修改页面内容,能完整捕获所有控制台输出的对象结构,兼容性更稳定。
方案3:提升Chrome控制台模块日志等级(轻量临时方案)
- 启动Chrome时追加参数
--vmodule=*console*=3,提升控制台相关模块的日志输出等级,部分版本的Chrome会在verbose级别3以上的日志中输出对象的结构化内容,该方案不需要额外开发,但不同Chrome版本表现差异较大,兼容性不稳定。
注意:如果需要序列化包含循环引用的对象,需要在
JSON.stringify的replacer函数中增加循环引用处理逻辑,避免序列化失败。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

