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 --save
winston-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', // 单个日志文件最大20MB
maxFiles: '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/bash
LOG_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=daily
Persistent=true
[Install]
WantedBy=timers.target
启用并启动定时任务:
sudo systemctl daemon-reload
sudo systemctl enable clean-nodejs-logs.timer
sudo systemctl start clean-nodejs-logs.timer
OnCalendar=*-*-* 01:00:00表示每天凌晨1点)。logrotate -f),避免误删日志;/var/log或应用日志目录的磁盘使用情况(如df -h),及时调整清理策略。通过以上方法,可有效管理Debian系统中Node.js应用的日志文件,避免磁盘空间耗尽,同时保留必要的日志信息用于排查问题。