Debian 上 JS(JavaScript)日志丢失 通常不是“系统把日志吃了”,而是日志写到哪里、谁在管日志、进程怎么退出这几个环节出了问题。下面按最常见原因给你梳理。
很多 Node.js 应用是:
console.log('xxx')
console.log(err)
在 systemd / pm2 / docker 环境下:
✅ 检查方式:
journalctl -u your-service
或
pm2 logs
Debian 默认用 systemd 管理服务。
如果服务是:
[Service]
ExecStart=/usr/bin/node app.js
那日志在:
/var/log/journal/
而不是你以为的 /var/log/xxx.log
✅ 解决:
journalctl -u your-app.service --since "1 hour ago"
或显式写日志文件:
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err
Node.js 是异步的:
console.log('error')
process.exit(1)
可能日志还没写出去进程就死了。
✅ 正确方式:
process.on('exit', () => {
// 同步写日志
})
或使用 pino / winston 这类可靠 logger。
Debian 默认:
/var/log 只有 root 可写✅ 检查:
ls -l /var/log/yourlog.log
whoami
✅ 建议:
sudo mkdir /var/log/myapp
sudo chown node:node /var/log/myapp
Debian 默认有:
/etc/logrotate.d/
可能:
✅ 检查:
ls /var/log/*.gz
cat /etc/logrotate.d/your-app
如果你在 Debian 上跑 Docker:
✅ 解决:
docker logspm2 默认:
~/.pm2/logs/
但:
✅ 检查:
pm2 logs
pm2 describe app
const fs = require('fs');
const log = fs.createWriteStream('/var/log/myapp/app.log', { flags: 'a' });
log.write(`[${new Date()}] error\n`);
或使用:
winstonpino[Service]
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node app.js
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
User=node
你可以按顺序查:
journalctl -u 服务名pm2 logsdocker logs 容器ls -l 日志路径ps aux | grep nodelogrotate如果你愿意,可以把下面信息发我,我能精准定位:
我可以直接帮你改配置。