Node.js 日志在 Linux 上“缺失”通常不是单一原因,而是输出方式、进程管理、系统限制、日志轮转等多个因素共同作用的结果。下面按最常见 → 较少见的顺序系统梳理原因与排查方法。
Node.js 中常见的日志方式:
console.log('info')
console.error('error')
在 Linux 中:
stdout → 通常是应用日志stderr → 通常是错误日志问题场景
直接运行:
node app.js
✅ 日志会显示在当前终端
后台运行:
node app.js &
nohup node app.js &
❌ 日志不会自动写入文件
✅ 解决办法
node app.js > app.log 2>&1
或使用 tee:
node app.js 2>&1 | tee app.log
pm2 logs
pm2 logs app-name
日志默认在:
~/.pm2/logs/
如果没日志:
pm2 flush
pm2 restart app
journalctl -u your-service-name -f
或查看 unit 文件:
StandardOutput=journal
StandardError=journal
✅ 改成文件:
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app-error.log
常见错误写法:
node app.js > /dev/null 2>&1
✅ 排查:
ps aux | grep node
例如 winston:
new winston.transports.File({
filename: '/var/log/app.log'
})
✅ 检查:
ls -l /var/log/app.log
✅ 是否有写权限:
whoami
logger.info('xxx') // 实际 level 是 error
✅ 检查 logger level:
logger.level
df -h
df -i
✅ 表现:
EACCES: permission denied
✅ 排查:
ls -ld /var/log
✅ 解决:
sudo chown -R appuser:appuser /var/log/app
/var/log/app.log {
daily
rotate 7
missingok
notifempty
create 0644 appuser appuser
}
✅ 检查:
ls -lh /var/log/app.log*
例如:
✅ 捕获:
process.on('uncaughtException', e => {
console.error(e)
})
❌ 错误:
winston.add(new transports.File(...))
✅ 正确:
winston.add(new transports.Console())
查看日志:
docker logs container_id
你可以按顺序自查:
console.log 还是 logger?console.log(JSON.stringify({ level, msg }))
如果你愿意,可以把以下信息贴出来,我可以精准定位:
我可以一步一步帮你查清 为什么日志“不见了”。