Ubuntu 上 Node.js 日志不更新,通常不是代码问题,而是日志被缓存、被重定向、被 systemd/journald 接管,或文件被覆盖/替换导致的。下面按最常见 → 较少见的顺序给你排查思路。
在 非 TTY 环境(systemd / docker / 后台运行) 下:
console.log()
默认是块缓冲,而不是行缓冲。
✅ 现象
node app.js 能看到日志✅ 解决方案
方式一:强制行缓冲(推荐)
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');
如果你用 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);
✅ 经典场景:
rm /var/log/app.log
但 Node.js 没重启 → 还在写旧 fd
✅ 现象:
lsof | grep deleted 能看到✅ 解决:
# 重启进程
systemctl restart your-service
如果你用 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 默认 非 TTY → stdout 缓冲
✅ 解决:
ENV NODE_ENV=production
或直接:
node --max-old-space-size=512 app.js
并确保:
console.log('ok')
✅ 推荐:用日志库
例如:
✅ 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
你可以直接把下面信息发我,我可以精准判断:
我可以直接给你最小改动、最稳的解决方案。