使用日志轮转工具(如logrotate)
logrotate是Ubuntu系统自带的日志管理工具,可自动切割、压缩和删除旧日志文件,防止日志过度占用磁盘空间。配置示例如下:
sudo apt-get install logrotatesudo nano /etc/logrotate.d/node-app/path/to/your/nodejs/app/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
postrotate
/usr/bin/killall -HUP node # 重启Node.js进程以释放日志句柄
endscript
}
关键参数说明:daily(每日轮转)、rotate 7(保留7天日志)、compress(压缩旧日志)、delaycompress(延迟压缩,避免当天日志被压缩)、missingok(日志文件不存在时不报错)、notifempty(日志为空时不轮转)、create(创建新日志文件并设置权限)。sudo logrotate -f /etc/logrotate.d/node-app(强制立即轮转)。通过Node.js日志库内置功能实现轮转
使用成熟的日志库(如winston),可通过其扩展模块实现日志自动切割,无需依赖系统工具。以winston为例:
npm install winston winston-daily-rotate-fileconst winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.printf(({ timestamp, level, message }) => `${timestamp} ${level}: ${message}`)
),
transports: [
new DailyRotateFile({
filename: '/path/to/logs/application-%DATE%.log', // 日志文件名模板(%DATE%会被替换为日期)
datePattern: 'YYYY-MM-DD', // 按天切割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB(可选,同时支持按大小切割)
maxFiles: '14d' // 保留14天日志(可选,与datePattern配合使用)
})
]
});
logger.info('Hello, world!');
关键参数:filename(日志文件路径,含日期占位符)、datePattern(日期格式,决定切割频率)、zippedArchive(是否压缩旧日志)、maxSize(单文件大小上限)、maxFiles(保留天数)。优化日志记录策略
减少不必要的日志写入是避免磁盘空间不足的根本措施:
error或warn,关闭info或debug级别的冗余日志(如logger.level = 'error')。使用进程管理工具(如PM2)
PM2是Node.js常用的进程管理工具,内置日志管理功能,可自动轮转日志并限制日志大小:
npm install pm2 -gecosystem.config.js文件:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/path/to/logs/out.log', // 标准输出日志路径
error_file: '/path/to/logs/err.log', // 错误输出日志路径
log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
log_rotation: {
period: '1d', // 每天轮转一次
rotateAfterSize: '10M', // 单个日志文件达到10MB时轮转
keepFiles: 7 // 保留最近7天的日志
}
}]
};
pm2 start ecosystem.config.jspm2 save(防止重启后丢失配置)。监控磁盘空间与自动化清理
定期检查磁盘空间使用情况,及时清理旧日志:
df -h命令查看各分区使用情况,du -sh /path/to/logs查看日志目录大小。#!/bin/bash
LOG_DIR="/path/to/nodejs/logs"
find "$LOG_DIR" -name "*.log" -type f -mtime +30 -exec rm -f {} \;
将脚本添加到crontab中(如每天凌晨2点执行):crontab -e,添加以下内容:0 2 * * * /path/to/cleanup_logs.sh
```。
集中式日志管理(可选)
对于分布式系统或多节点应用,可将日志发送到远程集中式日志管理系统(如ELK Stack、Graylog),减轻本地存储压力。这些系统提供强大的日志搜索、分析和告警功能,便于快速定位问题。