Debian Node.js 日志文件清理策略

在Debian系统中,Node.js应用程序的日志文件(如access.log、error.log)会随时间积累,占用大量磁盘空间。为避免这一问题,需通过自动化策略定期清理旧日志。以下是几种常用且高效的方法:
logrotate是Debian自带的日志管理工具,可自动完成日志轮转(分割)、压缩、删除旧日志等操作,无需修改应用程序代码,适合大多数场景。
安装logrotate(若未安装):
sudo apt-get update && sudo apt-get install logrotate创建Node.js专用配置文件:在/etc/logrotate.d/目录下新建nodejs文件(如/etc/logrotate.d/nodejs),添加以下内容:
/path/to/your/nodejs/logs/*.log {daily # 每天轮转一次(可根据需求改为weekly/monthly)rotate 7# 保留最近7个轮转日志(如7天日志)compress# 压缩旧日志(节省空间)delaycompress # 延迟压缩(当前轮转的日志不压缩,下次轮转时再压缩)missingok # 若日志文件不存在,不报错notifempty# 若日志为空,不轮转create 0640 root adm# 创建新日志文件,权限640,属主root,属组adm}注:将
/path/to/your/nodejs/logs/替换为Node.js应用的实际日志目录(如/var/log/nodejs/或应用工作目录下的logs/)。
测试配置有效性:手动触发一次日志轮转,检查是否按预期执行:
sudo logrotate -f /etc/logrotate.d/nodejs执行后,可查看日志目录,确认旧日志已被压缩(如access.log.1.gz)并生成新日志。
/etc/cron.daily/logrotate每日运行);若Node.js应用使用winston、bunyan等日志库,可通过第三方插件实现日志自动轮转,无需依赖系统工具。
npm install winston winston-daily-rotate-file --savewinston-daily-rotate-file作为传输层,设置轮转规则:const winston = require('winston');const DailyRotateFile = require('winston-daily-rotate-file');const logger = winston.createLogger({level: 'info',format: winston.format.combine(winston.format.timestamp(),winston.format.json()),transports: [new DailyRotateFile({filename: '/path/to/your/nodejs/logs/application-%DATE%.log', // 日志文件名(含日期)datePattern: 'YYYY-MM-DD', // 日期格式zippedArchive: true, // 压缩旧日志maxSize: '20m',// 单个日志文件最大20MBmaxFiles: '14d', // 保留14天的日志createSymlink: true, // 创建符号链接(指向最新日志)symlinkName: 'application.log' // 符号链接名称})]});// 示例日志记录logger.info('This is an info log message.');注:
maxSize控制单文件大小(如20MB),超过则轮转;maxFiles控制保留天数(如14天)。
若不想使用上述工具,可通过编写bash脚本,结合cron定时任务定期删除旧日志。
编写清理脚本:创建/usr/local/bin/clean-nodejs-logs.sh,内容如下:
#!/bin/bashLOG_DIR="/path/to/your/nodejs/logs"# 日志目录find "$LOG_DIR" -type f -name "*.log" -mtime +7 -exec rm -f {} ;# 删除7天前的.log文件注:
-mtime +7表示查找修改时间超过7天的文件。
赋予脚本执行权限:
sudo chmod +x /usr/local/bin/clean-nodejs-logs.sh添加cron定时任务:运行crontab -e,添加以下内容(每天凌晨1点执行):
0 1 * * * /usr/local/bin/clean-nodejs-logs.sh >> /var/log/clean-nodejs-logs.log 2>&1注:
>> /var/log/clean-nodejs-logs.log 2>&1将脚本输出重定向到日志文件,便于排查问题。
若Node.js应用通过systemd启动(如使用pm2或直接管理),可创建systemd定时任务(timer)来清理日志。
创建清理脚本:同步骤3,创建/usr/local/bin/clean-nodejs-logs.sh。
创建systemd服务文件:新建/etc/systemd/system/clean-nodejs-logs.service,内容如下:
[Unit]Description=Clean Node.js logs older than 7 days[Service]ExecStart=/usr/local/bin/clean-nodejs-logs.sh创建systemd定时任务文件:新建/etc/systemd/system/clean-nodejs-logs.timer,内容如下:
[Unit]Description=Run clean-nodejs-logs daily[Timer]OnCalendar=dailyPersistent=true[Install]WantedBy=timers.target启用并启动定时任务:
sudo systemctl daemon-reloadsudo systemctl enable clean-nodejs-logs.timersudo systemctl start clean-nodejs-logs.timerOnCalendar=*-*-* 01:00:00表示每天凌晨1点)。logrotate -f),避免误删日志;/var/log或应用日志目录的磁盘使用情况(如df -h),及时调整清理策略。通过以上方法,可有效管理Debian系统中Node.js应用的日志文件,避免磁盘空间耗尽,同时保留必要的日志信息用于排查问题。