1. 使用日志轮转工具控制日志文件大小与数量
日志轮转是优化日志存储的核心手段,可自动分割、压缩旧日志并删除过期文件,避免单个日志文件过大或数量过多占用磁盘空间。Ubuntu环境下主要有两种方式:
/etc/logrotate.d/node-app,添加以下内容:/path/to/your/nodejs/logs/*.log {
daily # 每天轮转一次(可根据需求改为weekly/monthly)
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 空日志文件不轮转
create 0640 root adm # 轮转后创建新日志文件并设置权限
copytruncate # 复制原日志后清空,适用于无法重启Node.js进程的场景
}
测试配置是否生效:sudo logrotate -f /etc/logrotate.d/node-app。winston-daily-rotate-file(配合winston):const winston = require('winston');
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',
zippedArchive: true, // 压缩旧日志
maxSize: '100m', // 单个日志文件最大100MB
maxFiles: '30d' // 保留30天的日志
})
]
});
或使用pino-rotate(配合pino):const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
transport: {
target: 'pino-rotate',
options: {
period: '1d', // 每天轮转
path: '/path/to/logs/application.log',
maxsize: '100m', // 单个日志文件最大100MB
maxfiles: '7' // 保留7个日志文件
}
}
});
2. 选择高性能日志库降低I/O开销
不同日志库的性能差异较大,选择合适的库可减少日志记录对应用性能的影响:
3. 配置合理的日志级别减少冗余日志
根据环境设置日志级别,避免记录不必要的信息:
error(错误)和warn(警告)级别日志,关闭info(信息)和debug(调试)级别,减少日志量。例如Winston配置:const logger = winston.createLogger({
level: 'warn', // 生产环境设为warn
transports: [new winston.transports.File({ filename: 'error.log', level: 'error' })]
});
debug级别,方便排查问题,但上线前需切换回生产级别。4. 启用异步日志写入避免阻塞主线程
同步日志写入会阻塞Node.js事件循环,影响应用性能。确保日志库使用异步模式:
bunyan-prettystream等工具实现异步。5. 采用结构化日志格式提升处理效率
结构化日志(如JSON格式)便于后续分析和自动化处理(如ELK Stack),同时减少冗余信息:
const logger = winston.createLogger({
format: winston.format.json(),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
const logger = pino();
logger.info({ message: 'User logged in', userId: 123 }); // 输出JSON格式
6. 将日志存储在高速存储设备提升IO性能
将日志文件存放在SSD(固态硬盘)而非HDD(机械硬盘)上,可显著提升日志写入和读取速度,尤其适合高流量应用。
7. 集中式日志管理减少本地存储压力
对于多服务器或大规模应用,将日志发送到集中式日志管理系统(如ELK Stack:Elasticsearch+Logstash+Kibana、Loggly、Graylog),避免本地存储大量日志:
pm2-logrotate模块,将日志发送到远程服务器或第三方服务。8. 定期监控与清理日志文件
du命令分析日志目录占用空间:du -sh /path/to/logs/*;df命令查看磁盘使用情况:df -h;0 0 * * 0 find /path/to/logs -name "*.log" -mtime +30 -exec rm -f {} \;
sudo apt clean(清理APT缓存)、sudo journalctl --vacuum-size=100M(清理systemd日志)。