在 Linux 上“JS 日志为空”通常不是 JS 本身的问题,而是运行环境 + 日志方式 + 权限/重定向导致的。下面按最常见原因逐一说明,并给出排查办法。
先明确场景,日志为空原因差别很大:
很多人在 Linux 里这样跑:
node app.js &
或:
nohup node app.js &
但:
✅ 正确方式:
node app.js > app.log 2>&1 &
查看:
tail -f app.log
例子:
console.log('start')
process.exit(0)
在某些 Linux / Docker 环境下,stdout 是块缓冲,进程直接退出会导致日志丢失。
✅ 解决:
fs.appendFileSync('app.log', 'start\n')
日志目录不存在或没权限:
fs.writeFileSync('/var/log/app.log', 'log')
在 Linux 上:
/var/log✅ 排查:
ls -ld /var/log
whoami
✅ 建议:
const logPath = path.join(__dirname, 'app.log')
例如 winston / pino:
logger.info('hello')
但配置是:
level: 'error'
✅ 检查:
用 systemd 跑 Node:
[Service]
ExecStart=/usr/bin/node app.js
日志在:
journalctl -u your-service
不是你以为的文件。
✅ 查看:
journalctl -u your-service -f
如果你是:
page.on('console', msg => {
console.log(msg.text())
})
但如果:
✅ 加:
page.on('pageerror', e => console.log(e))
Docker 默认:
❌ 错误:
fs.writeFileSync('/app/log.txt', 'x')
✅ 正确:
console.log('x')
然后:
docker logs container_id
请按顺序确认:
tail -f 或 journalctl 看对地方你可以直接贴:
我可以一眼指出“为什么是空的”。