在 Linux 下对 JavaScript(Node.js)应用的日志进行分割,常见做法有 3 类,从简单到专业依次是:
适合你自己控制日志格式和文件名。
const fs = require('fs');
const path = require('path');
const logDir = path.join(__dirname, 'logs');
if (!fs.existsSync(logDir)) fs.mkdirSync(logDir);
const getLogStream = () => {
const date = new Date().toISOString().slice(0, 10); // 2026-01-21
const logFile = path.join(logDir, `${date}.log`);
return fs.createWriteStream(logFile, { flags: 'a' });
};
setInterval(() => {
stream.end();
stream = getLogStream();
}, 24 * 60 * 60 * 1000); // 每天切换
✅ 优点:简单
❌ 缺点:无自动压缩、无历史清理
npm install winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: 'logs',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m', // 单文件最大
maxFiles: '14d', // 保留 14 天
zippedArchive: true // 自动压缩
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
transport,
new winston.transports.Console()
]
});
logger.info('Hello JS log');
✅ 自动按天 / 大小分割
✅ 自动压缩
✅ 自动清理
✅ 生产环境首选
即使你用 console.log 或 pm2 logs,也可以用 logrotate
sudo vim /etc/logrotate.d/node-app
/var/log/node/app.log {
daily
rotate 7
size 50M
compress
missingok
notifempty
copytruncate
}
| 参数 | 说明 |
|---|---|
| daily | 按天 |
| rotate | 保留份数 |
| size | 超过大小也切 |
| compress | gzip |
| copytruncate | 不中断进程 |
✅ 适合 PM2 / Docker / 裸跑 Node
✅ 不依赖 JS 代码
PM2 自带日志,但不会自动分割
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 20M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 最简单
✅ 适合 PM2 部署
| 场景 | 推荐方案 |
|---|---|
| 小项目 / 学习 | 应用层按日期 |
| 生产环境 | Winston + daily-rotate-file |
| PM2 部署 | pm2-logrotate |
| 随便跑的脚本 | logrotate |
如果你愿意,可以告诉我:
我可以帮你直接写 完整可上线配置。