Debian 环境下解读 JavaScript 错误日志的实用指南
一 定位与查看日志
- 先确定日志来源与存放路径:系统级日志在 /var/log/;服务日志常见于 /var/log/syslog、Web 服务器日志(如 /var/log/apache2/error.log、/var/log/nginx/error.log);Node.js 应用常写入自定义文件(如 app.log、error.log),或以服务方式由 journalctl 管理。
- 常用查看与过滤命令:
- 实时跟踪:tail -f /var/log/syslog 或 tail -f app.log
- 关键字过滤:grep -i “ERROR|Exception|Failed” /var/log/nginx/error.log
- 按服务查看:journalctl -u <service_name> -f
- 结构化日志解析:若日志为 JSON,使用 jq 提取字段(如 jq ‘select(.level==“error”)’ app.log)
- 建议先确认应用日志格式(纯文本/JSON)、是否按天轮转,以及当前实例是否为 systemd 服务,从而选择合适的查看方式。
二 读懂日志结构与关键字段
- 典型条目包含:时间戳、日志级别(INFO/WARN/ERROR)、源文件与行号、错误消息、堆栈跟踪。例如:
[2021-09-01 12:34:56] [ERROR] [app.js:123] - Error while processing request: Error: ECONNREFUSED
at …(堆栈)
- 快速定位步骤:
- 看时间戳,判断是否为集中爆发或单点偶发;
- 看日志级别,优先处理 ERROR;
- 读错误消息,抓住关键词(如 ECONNREFUSED、MODULE_NOT_FOUND);
- 对照源文件与行号,结合堆栈定位调用链。
三 常见错误类型与修复要点
| 错误类型 |
典型表现 |
修复要点 |
| SyntaxError |
Unexpected token、缺少括号/引号 |
检查语法、构建产物是否因 Babel/TS 配置错误未正确生成 |
| ReferenceError |
使用未声明变量 |
确认变量/模块已声明并在作用域内可见 |
| TypeError |
Cannot read property ‘x’ of undefined/null |
访问前做空值判断或提供默认值 |
| RangeError |
Maximum call stack size exceeded、非法数组长度 |
优化递归为迭代、校验参数范围 |
| URIError |
encodeURI/decodeURI 参数非法 |
校验输入是否合法 URI 编码 |
| Node 常见 |
ECONNREFUSED、MODULE_NOT_FOUND |
检查依赖安装(node_modules)、网络/目标服务可达性、环境变量与启动命令 |
四 高效排查与调试工作流
- 前端问题:在浏览器打开 开发者工具 Console/Sources,结合报错的文件与行号定位;必要时使用 source map 映射回原始源码。
- Node.js 后端:
- 启动调试:node --inspect-brk server.js,在 chrome://inspect 进行断点调试;
- VS Code:配置 .vscode/launch.json,断点单步;
- 服务环境:journalctl -u 查看完整输出与崩溃原因。
- 日志增强与检索:
- 统一日志格式(如 JSON),便于用 jq 聚合与筛选;
- 大流量场景引入 ELK Stack(Elasticsearch, Logstash, Kibana)/Splunk 做可视化与告警;
- 建立监控与阈值告警(如 Prometheus/Grafana),对 ERROR 计数、响应时延异常及时响应。
五 实用命令清单
- 实时查看系统日志:tail -f /var/log/syslog
- 过滤错误关键字:grep -i “ERROR” /var/log/nginx/error.log
- 查看服务日志:journalctl -u myapp.service -f
- 结构化日志筛选:jq ‘select(.level==“error”) | {ts:.time, msg:.msg}’ app.log
- 按时间窗口检索:journalctl --since “2025-12-10 00:00:00” --until “2025-12-10 12:00:00” -u myapp
- 日志轮转与维护:使用 logrotate 配置保留策略,避免磁盘被占满