温馨提示×

如何读懂nodejs linux日志

小樊
37
2026-10-08 11:04:45
栏目: 编程语言

读懂 Node.js 在 Linux 上的日志,核心不是“看文件”,而是先搞清楚日志从哪来、以什么形式记录、再看什么内容。下面按实用顺序讲。


一、先确认:日志在哪、谁写的

1. Node.js 应用自己打的日志

常见方式:

  • console.log / console.error
  • 日志库:winston、pino、bunyan、morgan(HTTP)

典型位置:

/app/logs/
/var/log/myapp/
stdout / stderr(被 systemd 或 pm2 捕获)

2. 进程管理器捕获的日志

PM2

pm2 logs
pm2 logs appName
~/.pm2/logs/

systemd(最常见)

journalctl -u yourapp.service
journalctl -u yourapp.service -f   # 实时
journalctl -u yourapp.service --since "2024-01-01"

3. 反向代理 / 系统日志

  • Nginx:/var/log/nginx/error.log
  • 系统:/var/log/syslog、/var/log/messages

二、日志里最常看到的几类内容

1. 请求日志(HTTP)

GET /api/user 200 12ms

关注:

  • 状态码(4xx / 5xx)
  • 响应时间
  • URL 是否异常

2. Error / Stack

Error: connect ECONNREFUSED 127.0.0.1:5432
    at TCPConnectWrap.afterConnect

重点看:

  • Error 类型
  • 最后几行 stack
  • 是不是数据库 / 第三方

3. 警告

(node:12345) Warning: Possible EventEmitter memory leak

通常是:

  • 监听器没清理
  • 连接池配置不对

4. 崩溃

worker exited
uncaughtException

说明进程直接挂了,需要看崩溃前最后日志


三、Linux 下怎么“读”日志(实战命令)

实时看

tail -f app.log
journalctl -u yourapp -f

查错误

grep -i error app.log
grep -C 5 "ECONNREFUSED" app.log

按时间

sed -n '/10:20/,/10:30/p' app.log
journalctl --since "10 min ago"

统计

grep " 500 " access.log | wc -l
awk '{print $1}' access.log | sort | uniq -c

四、常见“看不懂”的原因 & 解决

1. 日志太多,找不到重点

✅ 解决:

  • 按级别过滤(ERROR / WARN)
  • 用结构化日志(JSON)

2. 只有 console.log

✅ 建议:

  • 用 pino(快、JSON)
  • 区分 stdout / stderr

3. 生产环境没日志

✅ 检查:

  • systemd 是否重定向
  • PM2 是否开 log
  • Docker 是否写到 stdout

五、一个“标准可读”的 Node.js 日志示例

{
  "level": "error",
  "time": "2024-01-01T10:00:00Z",
  "msg": "DB connection failed",
  "stack": "...",
  "pid": 1234
}

你只需看:

  • level
  • time
  • msg
  • stack

六、快速自查清单

  • [ ] 日志在哪(pm2 / systemd / 文件)
  • [ ] 是否区分 stdout / stderr
  • [ ] 是否有错误级别
  • [ ] 是否能复现时间点
  • [ ] 是否结合 Nginx / DB 日志

如果你愿意,可以把一段真实日志贴出来(脱敏),我可以直接帮你“逐行翻译”是什么意思、问题在哪。

0 踩