优化Ubuntu上Node.js日志存储的实践方案
使用成熟的第三方日志库增强日志管理能力,常见选择包括:
winston-daily-rotate-file实现轮转);根据环境动态调整日志级别,减少不必要的日志写入:
error或warn,仅记录关键错误和警告,降低磁盘占用;debug或info,记录详细信息便于排查问题。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'error' : 'debug', // 环境变量控制级别
format: winston.format.json(),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() })); // 开发环境输出到控制台
}
通过自动切割和压缩旧日志,避免单个文件过大占用磁盘空间:
winston-daily-rotate-file,按天/大小分割日志,自动压缩旧文件。配置示例:const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log', // 文件名包含日期(如application-2025-10-07.log)
datePattern: 'YYYY-MM-DD', // 日期格式
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天内的日志
});
logrotate(Ubuntu自带),配置示例(/etc/logrotate.d/nodejs):/var/log/nodejs/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 640 root adm # 创建新文件权限
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
/usr/bin/killall -HUP node # 重启Node.js进程重新打开日志文件
endscript
}
将日志发送到集中式系统(如ELK Stack、Graylog、Datadog),解决分布式应用日志分散问题,提升查询和分析效率:
pm2-logrotate模块(PM2内置),自动管理多进程日志,配置示例(ecosystem.config.js):module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/var/log/nodejs/out.log',
error_file: '/var/log/nodejs/err.log',
log_rotation: {
period: '1d', # 每天轮转
rotateAfterSize: '10M', # 达到10MB轮转
keepFiles: 7 # 保留7天
}
}]
};
fs.writeFileSync等同步方法;process.memoryUsage()监控内存占用;exec_mode: 'cluster'),多进程共享日志,提升吞吐量。find命令定期删除过期日志(如7天前),示例:#!/bin/bash
find /var/log/nodejs -type f -name "*.log" -mtime +7 -exec rm -f {} \;
将脚本添加到cron(如每天凌晨2点执行):0 2 * * * /path/to/cleanup_script.sh
df -h定期检查磁盘使用情况,设置阈值报警(如磁盘空间低于20%时发送邮件通知)。