Node.js 在 Linux 上“日志不写”是一个很常见的问题,通常不是 Node 本身不输出,而是输出位置、权限、缓冲、进程管理方式导致的。下面按最常见原因给你排查清单。
Node.js 默认:
console.log → stdoutconsole.error → stderr如果你用:
node app.js
日志在终端
但如果是:
node app.js &
或
nohup node app.js &
日志可能:
nohup.out✅ 正确做法:
node app.js > app.log 2>&1 &
pm2 logs
或
pm2 logs app
如果你以为 console.log 会写文件,那是错的。
如果你用:
[Service]
ExecStart=/usr/bin/node /opt/app/app.js
日志在:
journalctl -u your-service -f
✅ 不会写到你自己的文件,除非你:
fs.appendFileSync('/var/log/app.log', msg)
常见原因:
/var/log/app.log
Node 进程用户(如 www / node)没写权限
✅ 检查:
ps aux | grep node
ls -l /var/log
✅ 修复:
sudo chown node:node /var/log/app.log
fs.writeFile(异步)kill -9✅ 解决:
fs.appendFileSyncprocess.on('exit', () => {})
例如 winston:
new winston.transports.File({ filename: 'app.log' })
但:
✅ 用绝对路径:
path.join(__dirname, 'app.log')
docker logs 容器名
✅ 容器内不要写文件,写 stdout:
console.log('hello')
自查:
console.log('start')
如果连这个都没有:
看:
journalctl -u xxx
pm2 logs
docker logs
console 还是 fs如果你愿意,可以直接贴:
我可以精准告诉你为什么没写。