要制定合理的容量规划,首先需要了解当前日志的存储规模、增长趋势和占用比例。通过以下命令快速获取关键数据:
du -sh /path/to/nodejs/logs/*(替换为实际日志路径),可统计各个日志文件的占用空间。df -h,确认日志所在分区(如/var/log或应用自定义路径)的剩余空间及使用率。du -sh /path/to/logs/$(date +%F)(每日记录)或工具(如vnStat监控磁盘流量),观察日志量的每日/每周增长规律。根据环境设置合理的日志级别,避免记录不必要的信息:
warn或error,仅记录潜在问题(如数据库连接超时、服务崩溃)和关键操作(如用户登录、订单创建),关闭info/debug等冗余日志。debug级别,方便排查问题,但上线前需切换回生产级别。const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 环境区分
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
通过日志轮转将单个日志文件分割成多个小文件,并删除过期文件,避免单个文件过大占用空间。常用方法:
/etc/logrotate.d/node-app配置文件,添加以下内容(按天轮转、保留7天、压缩旧日志):/path/to/nodejs/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
}
测试配置是否生效:sudo logrotate -f /etc/logrotate.d/node-app。winston-daily-rotate-file插件,支持按大小或时间轮转:const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: '/path/to/logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '100m', // 单个文件最大100MB
maxFiles: '30d' // 保留30天
})
]
});
优先选择高性能、低资源占用的日志库,减少日志记录对应用性能的影响,间接降低因性能瓶颈导致的日志堆积风险:
通过压缩减少日志文件的存储空间占用。logrotate的compress参数可自动压缩旧日志(如gzip),或使用Winston的zippedArchive: true选项(winston-daily-rotate-file插件)。
将日志文件存放在高速存储设备(如SSD)上,提升日志写入和读取速度,同时避免因存储设备性能瓶颈导致的日志堆积。例如,将日志目录挂载到/dev/sda1(SSD分区)而非/dev/sdb1(HDD分区)。
采用JSON格式输出日志,便于后续自动化处理(如提取关键字段、过滤无关信息),减少冗余数据的存储。例如:
logger.info({ message: 'User logged in', userId: 123, ip: '192.168.1.1', status: 'success' });
// 输出:{"level":"info","message":"User logged in","userId":123,"ip":"192.168.1.1","status":"success"}
结构化日志还能提升日志分析工具(如ELK)的效率,间接降低存储成本。
对于多服务器或大规模应用,将日志发送到集中式日志管理系统(如ELK Stack、Graylog、PM2内置日志管理),避免本地存储大量日志。例如:
pm2-logrotate模块,将日志发送到远程服务器或第三方服务(如Loggly)。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_rotate: {
period: '1d', // 每天轮转
rotateAfterSize: '10M', // 单个文件达到10MB时轮转
keepFiles: 7 // 保留7天
}
}]
};
集中式管理不仅能减轻本地存储压力,还能实现日志的统一分析和告警,提升运维效率。
使用以下命令定期检查磁盘使用情况:
df -h:查看各分区使用率,重点关注日志所在分区(如/var/log)。du -sh /path/to/logs/*:查看日志目录的具体大小,识别占用空间大的日志文件。编写Shell脚本定期删除超过指定天数的日志文件(如30天),并通过crontab设置定时任务:
cleanup_logs.sh):#!/bin/bash
LOG_DIR="/path/to/nodejs/logs"
find "$LOG_DIR" -name "*.log" -type f -mtime +30 -exec rm -f {} \;
crontab -e
输入:0 2 * * * /path/to/cleanup_logs.sh。使用监控工具(如Prometheus+Grafana、Zabbix)设置磁盘空间告警阈值(如80%),当磁盘空间即将耗尽时,及时通知运维人员处理(如扩容磁盘、清理日志)。
通过以上步骤,可实现对Ubuntu Node.js日志的有效容量规划,确保日志系统既能满足应用需求,又不会占用过多存储资源。