在 Linux 里分析 Node.js 日志,通常分 “日志在哪” → “怎么看” → “怎么分析/定位问题” 三步。下面按实战角度讲。
如果直接运行:
node app.js
日志默认输出到 stdout / stderr。
常见做法:
node app.js > app.log 2>&1
如果你用 PM2:
pm2 logs
pm2 logs appName
pm2 logs --lines 200
日志文件位置:
~/.pm2/logs/
如果是 systemd 启动:
journalctl -u node-app.service -f
journalctl -u node-app.service --since "1 hour ago"
例如:
logs/error.loglogs/access.logwinston / pino / bunyan 等tail -f app.log
tail -n 100 app.log
grep ERROR app.log
grep -i "exception" app.log
sed -n '/2026-01-21 10:00/,/2026-01-21 11:00/p' app.log
Error: Cannot find moduleError: Cannot find module 'express'
✅ 解决:
npm install
EADDRINUSEError: listen EADDRINUSE :::3000
✅ 查看谁占用了端口:
lsof -i:3000
# 或
netstat -tunlp | grep 3000
unhandledRejection / Uncaught ExceptionUnhandledPromiseRejectionWarning
✅ 重点看:
建议加:
process.on('unhandledRejection', e => {
console.error(e);
});
FATAL ERROR: Ineffective mark-compacts
✅ 分析:
node --inspect app.js
或用:
node --max-old-space-size=1024 app.js
用 pino 或 winston 输出 JSON:
{"level":"error","msg":"db timeout","pid":123}
分析:
jq '.msg' app.log
grep ERROR app.log | awk '{print $1}' | sort | uniq -c
top / htopstrace -p <pid>lsof -p <pid>✅ 使用 PM2 + 日志分割
✅ 日志级别分开(info / error)
✅ 不打印敏感信息
✅ 接入 ELK / Grafana Loki
如果你愿意,可以:
我可以直接帮你定位问题。