温馨提示×

nodejs linux日志为何丢失

小樊
38
2026-09-17 18:12:05
栏目: 编程语言

在 Linux 上 Node.js 日志“丢失”通常不是真的没产生,而是输出位置、缓冲、进程管理或重定向出了问题。下面按最常见原因逐一说明,并给出排查和解决办法。


一、日志被写到 stdout / stderr,但你看错地方

现象

  • console.log / console.error
  • 直接运行能看到日志
  • pm2 / systemd / nohup 后就“没了”

原因

Node.js 默认日志在:

  • console.logstdout
  • console.errorstderr

进程被后台运行后,这些流可能被:

  • 丢弃
  • 重定向到文件
  • 被进程管理器接管

解决

确认运行方式:

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

PM2:

pm2 logs
pm2 logs app

systemd:

journalctl -u your-service -f

二、stdout / stderr 被缓冲(最常见“假丢失”)

现象

  • 程序崩了,但最后几行日志没有
  • 定时任务 / 管道中日志不实时

原因

  • 非 TTY 环境下,stdout 是块缓冲
  • Node.js 崩溃前缓冲还没刷新

解决

  1. 使用 console.error(stderr 通常是无缓冲)
  2. 显式 flush(Node 不提供,但可用 process.stdout.write
  3. 用日志库(推荐)

三、进程异常退出,日志未来得及写

现象

  • 程序直接 SIGKILL
  • OOM 被杀
  • 未捕获异常

原因

  • process.exit() 立即退出
  • 异步日志未写完
  • SIGKILL 无法捕获

解决

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

process.on('SIGTERM', () => {
  // 清理 & 写日志
  process.exit(0);
});

使用同步或可靠日志库(见下)


四、日志库配置错误

常见库

  • winston
  • pino
  • log4js

典型问题

transport: new transports.File({ filename: 'log.txt' })

但:

  • 路径是相对路径(cwd 不对)
  • 目录不存在
  • 权限不足

建议

const path = require('path');
filename: path.resolve('/var/log/app/app.log')

五、systemd 吞掉日志

现象

  • console.log 看不到
  • 服务“正常运行”

原因

systemd 默认接管道日志

正确做法

[Service]
StandardOutput=journal
StandardError=journal

查看:

journalctl -u yourapp -f

六、文件被 logrotate / 删除

现象

  • 日志文件突然为空
  • 文件还在但没新内容

原因

  • 日志被删,但 fd 仍指向旧 inode
  • Node 没重新打开文件

解决

  • 使用支持 reload 的日志库
  • 或发 SIGUSR1 重开日志

七、Docker 场景(补充)

  • 日志在容器里
  • 容器退出即丢失
docker logs container_id

或挂载 volume:

-v /host/log:/app/log

✅ 推荐最佳实践

  1. 不要用裸 console
  2. 使用:
    • pino(快、可靠)
    • winston
  3. 日志写文件 + systemd/journal
  4. 捕获所有退出信号
  5. 用绝对路径

如果你愿意,可以贴:

  • 运行方式(pm2 / systemd / docker)
  • 日志代码
  • 丢失的具体场景

我可以直接帮你定位是哪一类问题。

0