1. 使用日志轮转工具(推荐)
日志轮转是解决日志文件过大的核心方法,通过定期切割、压缩和删除旧日志,控制单个文件大小及数量。Linux系统自带logrotate工具,配置灵活且无需修改应用代码:
/etc/logrotate.d/目录下新建文件(如node-app),添加以下内容(以/var/log/node-app.log为例):/var/log/node-app.log {
daily # 按天轮转(也可改为size 100M按大小轮转)
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(节省空间)
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不轮转
copytruncate # 复制原日志后清空,避免重启应用
dateext # 添加日期后缀(如node-app.log-20251021)
}
sudo logrotate -d /etc/logrotate.d/node-app模拟测试,确认配置无误后用sudo logrotate -f /etc/logrotate.d/node-app强制立即轮转。2. 第三方日志库内置轮转功能
通过Node.js日志库(如Winston、Pino)的内置插件实现更精细的控制,适合需要结构化日志或自定义格式的场景:
npm install winston-daily-rotate-file,配置示例如下:const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log', // 日志文件路径(含日期占位符)
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天日志
})
]
});
logger.info('This is a rotated log message.');
npm install pino-daily-rotate-file,配置示例如下:const pino = require('pino');
const pinoDailyRotateFile = require('pino-daily-rotate-file');
const logger = pino({}, pinoDailyRotateFile({
period: '1d', // 按天分割
dir: 'logs', // 日志存储目录
prefix: 'app' // 文件名前缀
}));
logger.info('This is a Pino rotated log message.');
以上配置均支持按大小或时间轮转,自动压缩旧日志,并限制保留数量。
3. 手动清理临时日志
若日志文件紧急过大,可通过Linux命令快速释放空间:
sudo truncate -s 0 /path/to/your/logfile.log
find /path/to/your/logs -type f -name "*.log" -mtime +30 -exec rm -f {} \;
此方法适用于临时缓解磁盘空间压力,但无法替代自动化日志管理。
4. 限制日志记录级别
通过调整日志级别,减少不必要的日志输出(如生产环境无需debug或trace级别日志):
const logger = winston.createLogger({
level: 'info', // 仅记录info及以上级别(error/warn/info)
transports: [new winston.transports.File({ filename: 'app.log' })]
});
log4js.configure({
appenders: { file: { type: 'file', filename: 'app.log' } },
categories: { default: { appenders: ['file'], level: 'warn' } } // 仅记录warn及以上
});
降低日志级别可显著减少日志文件大小,同时保留关键信息。
5. 使用PM2进程管理器的日志轮转
若使用PM2管理Node.js应用,可通过其内置的pm2-logrotate模块实现日志管理:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 100M # 单个日志文件最大100MB
pm2 set pm2-logrotate:retain 10 # 保留最近10个日志文件
pm2 set pm2-logrotate:compress true # 压缩旧日志
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 每天午夜轮转
PM2会自动监控应用日志,符合条件时触发轮转,适合使用PM2部署的项目。