温馨提示×

Ubuntu Nodejs日志为何不更新

小樊
35
2026-08-31 08:36:42
栏目: 编程语言

Ubuntu 上 Node.js 日志不更新,通常不是代码问题,而是日志被缓存、被重定向、被 systemd/journald 接管,或文件被覆盖/替换导致的。下面按最常见 → 较少见的顺序给你排查思路。


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

1️⃣ Node.js 的 stdout 被缓冲(最常见的坑)

非 TTY 环境(systemd / docker / 后台运行) 下:

console.log()

默认是块缓冲,而不是行缓冲

✅ 现象

  • 本地 node app.js 能看到日志
  • 放到服务器 / systemd 后,日志迟迟不出现

✅ 解决方案

方式一:强制行缓冲(推荐)

NODE_ENV=production node -e 'process.stdout._handle.setBlocking(true)' app.js

或启动参数:

node --disable-proto=delete app.js

方式二:使用文件流 + 不缓冲

import fs from 'fs';

const logStream = fs.createWriteStream('app.log', { flags: 'a' });

logStream.write('hello\n');

2️⃣ systemd 接管的日志不会直接写文件

如果你用 systemd 启动 Node.js:

[Service]
ExecStart=/usr/bin/node /app/app.js

✅ 日志不会写到:

/var/log/app.log

✅ 而是进了 journald

查看方式:

journalctl -u your-service-name -f

✅ 正确做法(二选一)

方案 A:让 systemd 写文件

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

方案 B:代码里直接写文件

const fs = require('fs');
const out = fs.createWriteStream('/var/log/app.log', { flags: 'a' });
process.stdout.write = out.write.bind(out);

3️⃣ 日志文件被删除但句柄还在

✅ 经典场景:

rm /var/log/app.log

但 Node.js 没重启 → 还在写旧 fd

✅ 现象:

  • lsof | grep deleted 能看到
  • 磁盘空间没释放
  • 文件“不存在但还在写”

✅ 解决:

# 重启进程
systemctl restart your-service

4️⃣ PM2 的日志被“换地方了”

如果你用 PM2:

pm2 logs

而不是你以为的:

/var/log/app.log

实际位置:

~/.pm2/logs/

✅ 查看:

pm2 list
pm2 logs app

✅ 自定义路径:

module.exports = {
  apps: [{
    name: 'app',
    script: 'app.js',
    out_file: '/var/log/app.log',
    error_file: '/var/log/app-error.log',
    merge_logs: true,
    autorestart: true
  }]
}

二、Docker / Ubuntu 常见组合问题

5️⃣ Docker 中 stdout 被缓冲

Docker 默认 非 TTY → stdout 缓冲

✅ 解决:

ENV NODE_ENV=production

或直接:

node --max-old-space-size=512 app.js

并确保:

console.log('ok')

✅ 推荐:用日志库


三、代码层问题

6️⃣ 日志库默认不立即 flush

例如:

  • winston
  • pino

✅ winston

new winston.transports.File({
  filename: 'app.log',
  options: { flags: 'a' }
})

✅ pino(推荐)

pino-pretty

四、快速自检清单(照着做)

# 1. 是否真的在运行?
ps aux | grep node

# 2. systemd 日志
journalctl -u your-service -f

# 3. 文件是否被删除
lsof | grep deleted

# 4. 是否 pm2
pm2 logs

# 5. stdout 是否被重定向
ls -l /proc/<pid>/fd/1

五、告诉你我最快定位的方法

你可以直接把下面信息发我,我可以精准判断

  1. 启动方式(systemd / pm2 / docker / 手动)
  2. 日志代码(console.log 还是 winston / pino)
  3. Ubuntu 版本
  4. Node.js 版本
  5. 日志“不更新”是指:
    • 文件大小不变?
    • 时间不更新?
    • 还是 tail -f 看不到?

我可以直接给你最小改动、最稳的解决方案

0