在 Ubuntu 上分析 Node.js 日志,通常分为 日志来源定位 → 查看方式 → 过滤/统计 → 问题定位 → 进阶分析 几个步骤。下面按最常见的场景给你一个完整指南。
Node.js 默认日志输出位置取决于启动方式:
| 启动方式 | 日志位置 |
|---|---|
| 直接运行 | stdout / stderr |
| systemd | journalctl |
| PM2 | ~/.pm2/logs/ |
| Docker | docker logs |
| nginx 反向代理 | /var/log/nginx/ |
journalctl -u your-node-service-name -f
查看历史:
journalctl -u your-node-service-name --since "2025-01-01" --until "2025-01-02"
查看日志目录:
pm2 logs
只看 error:
pm2 logs --err
查看指定应用:
pm2 logs app-name
日志路径:
~/.pm2/logs/
docker logs <container_id>
docker logs -f <container_id>
tail -f /path/to/log.log
PM2:
pm2 logs --lines 100
systemd:
journalctl -u your-service -f
grep -i error app.log
grep -i exception app.log
grep "2025-01-20 10:" app.log
grep -i error app.log | wc -l
常见日志:
Error: Cannot find module
listen EADDRINUSE
FATAL ERROR: Ineffective mark-compacts
重点看:
uncaughtExceptionunhandledRejectionENOMEMSIGKILL关注:
heap out of memory配合:
node --inspect
如果是 HTTP 服务,重点看:
Node.js 中输出:
console.log(JSON.stringify({
level: 'error',
time: new Date().toISOString(),
message: 'DB connection failed'
}));
分析:
jq . app.log
过滤 error:
jq 'select(.level=="error")' app.log
lnav(强烈推荐)sudo apt install lnav
lnav /var/log/app.log
✅ 使用日志库
winstonpino(性能最好)✅ 区分环境
✅ 不要只 console.log
# 1. 看最近日志
tail -n 200 app.log
# 2. 查找错误
grep -i error app.log
# 3. 看 crash 前最后 50 行
tail -n 50 app.log | less
# 4. 看系统资源
dmesg | grep -i kill
free -h
如果你愿意,可以直接把 一段 Node.js 日志贴出来,我可以帮你 精准分析是哪一类问题(内存 / 请求 / 代码 / 系统)。