收集日志的方法
主动判断我们在一些运算之后得到一个期望的结果然而结果不是我们想要的// test.js function calc(){ // code... return val; } if(calc() ! someVal){ Reporter.send({ position: test.js::Functioncalc msg: calc error }); }这种属于逻辑错误/状态错误的反馈在接口status判断中用的比较多。2.try..catch捕获判断一个代码段中存在的错误try { init(); // code... } catch(e){ Reporter.send(format(e)); }以init为程序的入口代码中所有同步执行出现的错误都会被捕获这种方式也可以很好的避免程序刚跑起来就挂。3.window.onerror捕获全局错误window.onerror function() { var errInfo format(arguments); Reporter.send(errInfo); return true; };在上面的函数中返回return true错误便不会暴露到控制台中。下面是它的参数信息/** * param {String} errorMessage 错误信息 * param {String} scriptURI 出错的文件 * param {Long} lineNumber 出错代码的行号 * param {Long} columnNumber 出错代码的列号 * param {Object} errorObj 错误的详细信息Anything */ window.onerror function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) { // code.. }window.onerror算是一种特别暴力的容错手段try..catch也是如此他们底层的实现就是利用 C/C 中的goto语句实现一旦发现错误不管目前的堆栈有多深不管代码运行到了何处直接跑到顶层或者try..catch捕获的那一层这种一脚踢开错误的处理方式并不是很好。☞ 收集日志存在的问题收集日志的目的是为了及时发现问题最好日志能够告诉我们错误在哪里更优秀的做法是不仅告诉错误在哪里还告诉我们如何处理这个错误。终极目标是发现错误自动容错这一步是最难的。1. 无具体报错信息Script error.先看下面的例子test.html!-- http://barret/test.html -- script window.onerror function(){ console.log(arguments); }; /script script srchttp://barret/test.js/scripttest.js// http://barret/test.js function test(){ ver a 1; return a1; } test();我们期望收集到的日志是下面这样具体的信息为了对资源进行更好的配置和管理我们通常将静态资源放到异域上!-- http://barret/test.html -- script window.onerror function(){ console.log(arguments); }; /script script srchttp://localhost/test.js/script而拿到的结果却是翻开 Chromium 的 WebCore 源码可以看到跨域情况下返回的结果是Script error.。// http://trac.webkit.org/browser/branches/chromium/1453/Source/WebCore/dom/ScriptExecutionContext.cpp#L333 String message errorMessage; int line lineNumber; String sourceName sourceURL; // 已经拿到了所有的错误信息但如果发现是非同源情况sanitizeScriptError 中复写错误信息 sanitizeScriptError(message, line, sourceName, cachedScript);旧版 的 WebCore 中只判断了securityOrigin()-canRequest(targetURL)新版中还多了一个cachedScript的判断可以看出浏览器对这方面的限制越来越严格。在本地测试了下可见在file://协议下securityOrigin()-canRequest(targetURL)也是false。☞ 为何Script error.?简单报错Script error目的是避免数据泄露到不安全的域中一个简单的例子script srcbank.com/login.html/script上面我们并没有引入一个 js 文件而是一个 html这个 html 是银行的登录页面如果你已经登录了bank.com那 login 页面就会自动跳转到Welcome xxx...如果未登录则跳转到Please Login...那么 JS 报错也会是Welcome xxx... is not definedPlease Login... is not defined通过这些信息可以判断一个用户是否登录他的银行帐号给 hacker 提供了十分便利的判断渠道这是相当不安全的。☞crossOrigin参数跳过跨域限制image 和 script 标签都有 crossorigin 参数它的作用就是告诉浏览器我要加载一个外域的资源并且我信任这个资源。script srchttp://localhost/test.js crossorigin/script然而却报错了这是意料之中的错误跨域资源共享策略要求服务器也设置Access-Control-Allow-Origin的响应头header(Access-Control-Allow-Origin: *);回头看看我们 CDN 的资源Javascript/CSS/Image/Font/SWF 等这些静态资源其实都已经早早地加上了 CORS 响应头。2. 压缩代码无法定位到错误的具体位置线上的代码几乎都是经过打包压缩的几十上百的文件压缩后打包成一个而且只有一行。当我们收到a is not defined的时候如果只在特定场景下才报错我们根本无法定位到这个被压缩的a是个什么东西那么此时的错误日志就是无效的。第一个想到的办法是利用 sourceMap利用它可以定位到压缩代码某一点在未压缩代码的具体位置。下面是 sourceMap 引入的格式在代码的最后一行加入//# sourceMappingURLindex.js.map以前使用的是 ‘//’ 作为开头现在使用 ‘//#’然而对于错误上报这玩意儿没啥用。JS 不能拿到他真实的行数只能通过 Chrome DevTools 这样的工具辅助定位而且并不是每个线上资源都会添加 sourceMap 文件。sourceMap 的用途目前还只能体现在开发阶段。当然如果理解了 sourceMap 的 VLQ编码和位置对应关系也可以将拿到的日志进行二次解析映射到真实路径位置这个成本比较高貌似暂时也没人尝试过。那么有什么办法可以定位错误的具体位置或者说有什么办法可以缩小我们定位问题的难度呢可以这样考虑打包的时候在每两个合并的文件之间加上 1000 个空行最后上线的文件就会变成(function(){var longCode.....})(); // file 1 // 1000 个空行 (function(){var longCode.....})(); // file 2 // 1000 个空行 (function(){var longCode.....})(); // file 3 // 1000 个空行 (function(){var longCode.....})(); // file 4 var _fileConfig [file 1, file 2, file 3, file 4]如果报错在第 3001 行window.onerror function(msg, url, line, col, error){ // line 3001 var lineNum line; console.log(错误位置 _fileConfig[parseInt(lineNum / 1000) - 1]); // - 错误位置file 3

相关新闻

模型动态量化实践:让大模型瘦身加速的实战指南

模型动态量化实践:让大模型瘦身加速的实战指南

一、引言:当BERT变得"臃肿",我们该怎么办? 自从2018年Google提出BERT以来,基于Transformer架构的预训练模型彻底改变了自然语言处理(NLP)的格局。然而,“成也萧何,败也萧…

2026/7/3 1:13:46阅读更多 →
MySQL零基础入门(二)

MySQL零基础入门(二)

CentOS 7 下安装 MySQL 8.0 详细教程 MySQL版本:8.0.x 操作系统:CentOS 7(演示环境为 CentOS Linux release 7.9.2009) 安装方式:MySQL Yum 仓库 前置要求:安装之前先确保没有 MySQL 服务正在运行&#xff…

2026/7/3 1:08:46阅读更多 →
终极Windows 11部署指南:MediaCreationTool.bat一键制作安装介质与绕过硬件限制

终极Windows 11部署指南:MediaCreationTool.bat一键制作安装介质与绕过硬件限制

终极Windows 11部署指南:MediaCreationTool.bat一键制作安装介质与绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCr…

2026/7/3 1:08:46阅读更多 →
使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法

使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法

。下面是我们本次的工程目录。MyPkg├── Application│ └── GopDrawApp│ ├── GopDrawApp.c│ └── GopDrawApp.inf├── MyPkg.dec└── MyPkg.dsc什么是图形输出协议(GOP)GOP(Graphics Output Protocol,图形输…

2026/7/3 2:33:50阅读更多 →
只有程序员才能读懂的西游记

只有程序员才能读懂的西游记

我佛造经传极乐 话说我佛如来为度化天下苍生,有三藏真经,可劝人为善。 就如图中所示,真经所藏之处,在于云端。佛祖所管辖之下,有四个区域Region,称为四大部洲, 一是东胜神洲,二是南…

2026/7/3 2:33:50阅读更多 →
SpringBoot日志系统

SpringBoot日志系统

前言:日志是后端项目的“黑匣子”,是排查Bug、追踪业务、统计线上问题、复盘故障的核心依据。SpringBoot 对 Java 混乱的日志体系做了统一封装,开箱即用、无需复杂配置。一、日志的核心概念简单来说,日志就是程序运行的“运行记录…

2026/7/3 2:33:50阅读更多 →
JMeter高并发压测端口耗尽问题:从原理到实战解决方案

JMeter高并发压测端口耗尽问题:从原理到实战解决方案

1. 项目概述:当压测遭遇“端口耗尽”的困境如果你正在用JMeter做压力测试,特别是并发量稍微上去一点,比如几百上千个线程,突然在“察看结果树”里看到一片刺眼的红色,错误信息里赫然写着java.net.BindException: Addre…

2026/7/3 2:33:50阅读更多 →
出海 SEO 怎么找关键词?5 个方法

出海 SEO 怎么找关键词?5 个方法

这段时间看了很多出海 SEO 找词教程和文章。刚开始脑子里全是零碎方法:谷歌搜索建议、谷歌趋势、竞品分析、Reddit、长尾词、程序化 SEO。看多了以后发现,其实可以先收成 5 个方法。新词、老词、词根、竞品、社区。先把这 5 个方法分清楚,后面…

2026/7/3 2:33:50阅读更多 →
从AI编程助手到自动化工作流:构建可持续运行的AI Agent系统

从AI编程助手到自动化工作流:构建可持续运行的AI Agent系统

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 最近在技术社区里,一个概念被反复提及,热度持续攀升: AI Agent 构建 AI Agent 。听起来有点“…

2026/7/3 2:28:50阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →