1. 使用系统级工具logrotate(推荐)
logrotate是Debian系统原生支持的日志管理工具,可自动处理Node.js日志的轮转、压缩、删除及权限管理,无需修改应用代码。
sudo apt-get install logrotate命令安装。/etc/logrotate.d/目录下新建nodejs文件(如/etc/logrotate.d/nodejs),添加以下配置(根据实际路径调整):/var/log/nodejs/*.log {
daily # 每天轮转(可改为weekly/monthly)
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第8个文件才压缩第1个,避免压缩当天日志)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 创建新日志文件,权限0640,属主root,属组adm
}
sudo logrotate -d /etc/logrotate.d/nodejs测试配置语法(dry run),无误后用sudo logrotate -f /etc/logrotate.d/nodejs强制立即执行。2. 通过Node.js日志库内置轮转功能
若应用使用winston、bunyan等日志库,可通过插件实现应用层日志轮转,适合需要更细粒度控制的场景。
npm install winston winston-daily-rotate-file,配置示例如下:const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log', // 日志文件名(含日期)
datePattern: 'YYYY-MM-DD', // 日期格式
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个日志文件最大20MB
maxFiles: '14d' // 保留14天日志
})
]
});
bunyan-rotating-file-stream,配置方式类似,支持按大小或时间轮转。3. 定时任务辅助清理
通过cron定时运行脚本,定期删除过期日志(适合简单场景或补充logrotate)。
/usr/local/bin/cleanNodeLogs.sh,内容如下:#!/bin/bash
LOG_DIR="/var/log/nodejs"
DAYS_TO_KEEP=7 # 保留7天日志
find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
find "$LOG_DIR" -type f -name "*.log.gz" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
sudo chmod +x /usr/local/bin/cleanNodeLogs.sh。crontab -e,添加以下行(每天凌晨2点执行):0 2 * * * /usr/local/bin/cleanNodeLogs.sh >> /var/log/log-cleanup.log 2>&1
日志会记录到/var/log/log-cleanup.log中。4. 日志库与系统工具结合
优先使用日志库(如winston)的内置轮转处理应用层日志,再通过logrotate管理库生成的日志文件(如/var/log/nodejs/*.log),实现双重保障。例如:winston配置maxFiles: '14d'保留14天,logrotate配置rotate 7保留7天,确保日志不会无限增长。
5. 监控与告警
设置监控机制,及时发现日志异常增长:
cron定期检查日志目录大小(如du -sh /var/log/nodejs),超过阈值时发送邮件/短信告警。/usr/local/bin/checkLogSize.sh:#!/bin/bash
LOG_DIR="/var/log/nodejs"
MAX_SIZE=$((10 * 1024 * 1024)) # 10MB(根据磁盘空间调整)
CURRENT_SIZE=$(du -s "$LOG_DIR" | awk '{print $1}')
if [ "$CURRENT_SIZE" -gt "$MAX_SIZE" ]; then
echo "Node.js日志目录大小超过阈值:${CURRENT_SIZE}KB > ${MAX_SIZE}KB" | mail -s "Node.js日志告警" admin@example.com
fi
添加cron任务(每小时执行):0 * * * * /usr/local/bin/checkLogSize.sh。