Ubuntu Node.js 日志清理策略
一 系统级策略
/path/to/your/nodejs/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 your_user your_group
}
要点:
sudo logrotate -f /etc/logrotate.d/nodejs;通常系统每日由 cron 自动调用 logrotate,无需额外操作。sudo journalctl --vacuum-time 3d
sudo journalctl --vacuum-size 500M
建议仅清理系统级 journal,业务日志仍交由应用或 logrotate 管理。二 应用内策略
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
transports: [
new DailyRotateFile({
filename: '/path/to/your/nodejs/app/logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
要点:
三 进程管理工具策略
pm2 logs my-app --clear(仅清空缓冲,不删归档)。module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/path/to/your/nodejs/logs/out.log',
error_file: '/path/to/your/nodejs/logs/err.log',
log_date_format: 'YYYY-MM-DD HH:mm Z',
max_size: '10M',
retain: 7
}]
};
四 脚本与定时任务策略
// clean-old-logs.js
const fs = require('fs');
const path = require('path');
const logsDir = '/path/to/your/nodejs/logs';
const maxDays = 7;
fs.readdir(logsDir, (err, files) => {
if (err) return console.error(err);
const now = Date.now();
files.forEach(f => {
fs.stat(path.join(logsDir, f), (e, s) => {
if (e) return console.error(e);
const age = (now - s.mtimeMs) / (1000 * 3600 * 24);
if (age > maxDays) fs.unlink(path.join(logsDir, f), () => {});
});
});
});
0 1 * * * find /path/to/your/nodejs/logs -type f -name "*.log" -mtime +7 -delete五 策略选择与落地建议