Linux 下 JS 日志为空,通常不是“没写日志”,而是日志没落到你以为的地方。下面按最常见原因逐条排查,基本都能定位到。
| 现象 | 常见原因 |
|---|---|
| 文件存在但为空 | 日志被缓冲,没 flush |
| 运行时没报错 | 输出到 stdout / stderr,被 systemd / 容器接管 |
| 只在终端有日志 | 代码里用了 console.log,但没写文件 |
| 服务启动后日志为空 | 输出被重定向或丢弃 |
| Node.js 程序 | 日志还在内存 buffer 中 |
console.log 默认不写文件console.log('hello');
✅ 只会输出到 标准输出(stdout)
❌ 不会自动生成日志文件
解决方式
const fs = require('fs');
fs.appendFileSync('app.log', 'hello\n');
或使用日志库:
npm i winston
如果你用:
systemctl start myapp
那么:
console.log → journalctl✅ 查看日志:
journalctl -u myapp -f
✅ 或重定向输出:
# systemd service
StandardOutput=append:/var/log/myapp.log
StandardError=append:/var/log/myapp.log
Node.js 在标准输出是 块缓冲 的。
✅ 强制不缓冲:
node app.js | cat
或:
process.stdout.write('log\n');
❌ Linux 上 不会有 JS 日志文件
浏览器 JS 日志:
✅ 如果你想要日志:
PM2 默认会接管日志
查看日志:
pm2 logs
日志位置:
~/.pm2/logs/
✅ 如果你自己又写文件,但 PM2 没 flush,也会为空。
ls -l your.log
✅ 确认:
touch test.log
echo ok > test.log
/dev/null检查启动命令:
ps aux | grep node
如果有:
> /dev/null 2>&1
✅ 日志会被丢弃
请逐条确认:
console.log?fs.write / fs.appendFile?你可以直接贴出:
我可以精确告诉你是哪一条导致日志为空 ✅