在 Debian 系统上优化 JavaScript(JS)相关日志,核心目标是减少磁盘 I/O、提高可读性、便于排查问题,同时避免日志把磁盘写满。下面按常见场景给你一套实用优化方案。
先确认你的 JS 日志来自哪里:
| 场景 | 常见日志位置 |
|---|---|
| Node.js 应用 | stdout / stderr、文件日志 |
| PM2 管理 | ~/.pm2/logs/ |
| Nginx 反向代理 | /var/log/nginx/ |
| 前端 JS | 浏览器 console(服务器不可控) |
| Systemd 服务 | journalctl |
fs.appendFile❌ 错误示例:
fs.appendFileSync('app.log', log)
✅ 正确做法:使用专业日志库
推荐:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({
filename: '/var/log/myapp/error.log',
level: 'error',
maxsize: 10 * 1024 * 1024, // 10MB
maxFiles: 5,
}),
new winston.transports.File({
filename: '/var/log/myapp/combined.log',
maxsize: 20 * 1024 * 1024,
maxFiles: 7,
}),
],
});
✅ 优点:
const pino = require('pino');
const logger = pino({
level: 'info',
}, pino.destination('/var/log/myapp/app.log'));
配合 pino-rotating-file 或 logrotate 使用。
sudo nano /etc/logrotate.d/myapp
示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
postrotate
systemctl reload myapp || true
endscript
}
✅ 效果:
sudo nano /etc/systemd/journald.conf
SystemMaxUse=200M
RuntimeMaxUse=100M
然后:
sudo systemctl restart systemd-journald
journalctl -u myapp.service -f
建议:
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
✅ 防止 ~/.pm2/logs 爆满
如果是接口日志:
access_log /var/log/nginx/access.log combined buffer=32k flush=5m;
error_log /var/log/nginx/error.log warn;
✅ 减少磁盘写频率
✅ 只记录 warn 及以上错误
| 环境 | 推荐级别 |
|---|---|
| 生产 | warn / error |
| 预发 | info |
| 本地 | debug |
logger.level = process.env.NODE_ENV === 'production' ? 'warn' : 'info';
❌ console.log 大量输出
❌ 日志中打印整个 req / res
❌ 同步写日志
❌ 日志目录权限错误
❌ 忘记 logrotate
✅ Node.js + Pino + logrotate
✅ PM2 + pm2-logrotate
✅ Systemd journal 限制大小
如果你愿意,可以告诉我:
我可以直接帮你给出针对你环境的完整配置。