在 Linux 下 JS 日志不输出,通常不是“日志没产生”,而是输出位置/环境/缓冲/权限等问题。下面按常见原因逐一说明,并给出排查方法。
| 现象 | 可能原因 |
|---|---|
控制台没看到 console.log |
被重定向 / 后台运行 |
| 日志文件为空 | 输出缓冲未刷新 |
| 定时任务没日志 | crontab 环境变量不同 |
| Docker 里看不到 | stdout 未接出来 |
| PM2 没日志 | 没看对日志文件 |
| 权限问题 | 没写权限 |
console.log 其实输出了,但你没看到node app.js &
日志在 标准输出,但你终端已退出。
✅ 正确方式:
node app.js > app.log 2>&1 &
查看:
tail -f app.log
Node 在 非 TTY 情况下会缓冲 stdout。
✅ 强制不缓冲:
process.stdout.write(log + "\n")
或:
stdbuf -oL node app.js
❌ 错误示例:
fs.writeFileSync('log.txt', data)
但如果程序异常退出,可能没写完。
✅ 推荐:
fs.appendFileSync('log.txt', data + "\n")
PM2 日志不在你终端:
pm2 logs
pm2 logs app
日志位置:
~/.pm2/logs/
cron 环境 没有 PATH / TTY
❌ 错误:
* * * * * node /app/app.js
✅ 正确:
* * * * * /usr/bin/node /app/app.js >> /app/log.txt 2>&1
❌ 浏览器 JS 不会在 Linux 终端输出
console.log → 浏览器 DevTools✅ 若想收集前端日志:
Docker 只看 stdout/stderr
❌ 错误:
fs.writeFile('/log.txt', ...)
✅ 正确:
console.log(...)
查看:
docker logs 容器名
ls -l log.txt
无写权限时:
chmod 777 log.txt # 临时
chown user:user log.txt
# 1. 是否真在运行
ps aux | grep node
# 2. 看标准输出
node app.js 2>&1 | tee log.txt
# 3. PM2
pm2 logs
# 4. Docker
docker logs <id>
# 5. cron
tail -f /var/log/syslog
请告诉我:
console.log / 文件 / winston)我可以直接帮你改到“一定能看到日志”。