温馨提示×

Nodejs日志为何在Linux缺失

小樊
37
2026-08-29 00:41:22
栏目: 编程语言

Node.js 日志在 Linux 上“缺失”通常不是单一原因,而是输出方式、进程管理、系统限制、日志轮转等多个因素共同作用的结果。下面按最常见 → 较少见的顺序系统梳理原因与排查方法。


一、最常见原因(90% 都在这里)

1️⃣ 日志输出到 stdout / stderr,但被“吞掉”

Node.js 中常见的日志方式:

console.log('info')
console.error('error')

在 Linux 中:

  • stdout → 通常是应用日志
  • stderr → 通常是错误日志

问题场景

  • 直接运行:

    node app.js
    

    ✅ 日志会显示在当前终端

  • 后台运行:

    node app.js &
    nohup node app.js &
    

    ❌ 日志不会自动写入文件

解决办法

node app.js > app.log 2>&1

或使用 tee

node app.js 2>&1 | tee app.log

2️⃣ 使用 PM2 / systemd,但没查看对应日志

✅ PM2

pm2 logs
pm2 logs app-name

日志默认在:

~/.pm2/logs/

如果没日志:

pm2 flush
pm2 restart app

✅ systemd

journalctl -u your-service-name -f

或查看 unit 文件:

StandardOutput=journal
StandardError=journal

✅ 改成文件:

StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app-error.log

3️⃣ 日志被重定向到 /dev/null(致命)

常见错误写法:

node app.js > /dev/null 2>&1

✅ 排查:

ps aux | grep node

二、Node.js 自身问题

4️⃣ 日志被 winston / pino / bunyan 写到了你没找的地方

例如 winston:

new winston.transports.File({
  filename: '/var/log/app.log'
})

✅ 检查:

ls -l /var/log/app.log

✅ 是否有写权限:

whoami

5️⃣ 日志级别设置过高

logger.info('xxx') // 实际 level 是 error

✅ 检查 logger level:

logger.level

6️⃣ 磁盘满 / inode 满

df -h
df -i

✅ 表现:

  • 日志文件大小为 0
  • 不报错但写不进去

三、Linux 系统级原因

7️⃣ 权限不足(最常见坑)

EACCES: permission denied

✅ 排查:

ls -ld /var/log

✅ 解决:

sudo chown -R appuser:appuser /var/log/app

8️⃣ 日志被 logrotate 截断

/var/log/app.log {
    daily
    rotate 7
    missingok
    notifempty
    create 0644 appuser appuser
}

✅ 检查:

ls -lh /var/log/app.log*

9️⃣ 进程异常退出,日志来不及写

例如:

  • 未捕获异常
  • Docker 中主进程退出

✅ 捕获:

process.on('uncaughtException', e => {
  console.error(e)
})

四、Docker / 容器场景(很重要)

10️⃣ Docker 中日志没写到 stdout

❌ 错误:

winston.add(new transports.File(...))

✅ 正确:

winston.add(new transports.Console())

查看日志:

docker logs container_id

五、快速自检清单 ✅

你可以按顺序自查:

  1. 日志是 console.log 还是 logger?
  2. 日志写在哪?文件名 & 路径
  3. 进程如何启动?(PM2 / systemd / docker / shell)
  4. 日志文件是否存在?大小是否为 0?
  5. 磁盘 & inode 是否满?
  6. 是否有写权限?
  7. 是否被 logrotate 截断?

六、推荐的标准做法 ✅

✅ 生产环境最佳实践

  • 日志输出到 stdout / stderr
  • PM2 / systemd / Docker / k8s 管理日志
  • 不用 Node 自己写文件
console.log(JSON.stringify({ level, msg }))

如果你愿意,可以把以下信息贴出来,我可以精准定位

  • 启动方式(PM2 / systemd / docker)
  • 日志代码(console / winston / pino)
  • 日志文件路径
  • Linux 发行版 & 内核版本

我可以一步一步帮你查清 为什么日志“不见了”

0