日志自动清理可通过五种方法实现:一、logrotate按时间轮转;二、logrotate按大小轮转;三、crontab+find定期删除;四、truncate清空活跃日志;五、olddir统一归档并管控权限。

如果您发现Linux系统中日志持续增长、磁盘空间被快速占满,但又不希望手动干预,则很可能是日志缺乏自动化轮转与清理机制。以下是实现日志自动清理的多种可靠配置方法:
一、使用logrotate按时间周期自动轮转并删除旧日志
logrotate是Linux原生标配工具,通过定义轮转频率与保留数量,可自动重命名、压缩、删除过期日志归档,无需脚本即可完成全生命周期管理。
1、编辑服务专属配置文件:sudo vi /etc/logrotate.d/myapp
2、写入标准时间驱动配置(以/var/log/myapp/app.log为例):
/var/log/myapp/app.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 myapp myapp
sharedscripts
postrotate
[ -f /var/run/myapp.pid ] && kill -USR1 $(cat /var/run/myapp.pid)
endscript
}
3、强制执行一次验证:sudo logrotate -fv /etc/logrotate.d/myapp
4、确认状态文件更新:sudo cat /var/lib/logrotate/status | grep myapp
二、使用logrotate按文件大小触发轮转与清理
针对高吞吐服务(如API网关、实时采集程序),单个日志可能在数小时内突破GB级,仅靠daily策略无法及时切割;启用size参数可确保达到阈值立即轮转,避免I/O阻塞或磁盘打满。
1、修改对应配置文件:sudo vi /etc/logrotate.d/nginx
2、将时间指令替换为大小条件:size +100M
3、保留关键清理参数:rotate 14 compress missingok notifempty create 0640 www-data adm
4、添加maxage确保兜底清理:maxage 30
5、测试运行:sudo logrotate -d /etc/logrotate.d/nginx
三、用crontab配合find命令定期删除超期日志文件
当应用自建日志路径未纳入logrotate管理(如/data/logs/、/opt/app/logs/),或需对非标准格式日志(无时间戳后缀)进行硬性清理时,可借助find按mtime精确控制保留窗口。
1、编写清理命令:find /data/logs -name "*.log" -type f -mtime +15 -delete
2、编辑root定时任务:sudo crontab -e
3、添加每日执行行:0 3 * * * find /data/logs -name "*.log" -type f -mtime +15 -delete
4、验证权限与路径有效性:sudo -u root find /data/logs -name "*.log" -type f -mtime +15 -print | head -5
四、清空活跃日志文件而不中断服务写入
某些场景下需立即释放空间但不允许停服(如生产环境紧急处置),此时不能直接rm或mv日志文件,而应采用截断方式——保持inode不变,使进程继续向同一文件描述符写入,避免日志丢失。
1、确认目标日志路径及权限:ls -l /var/log/syslog
2、执行安全清空操作:sudo truncate -s 0 /var/log/syslog
3、验证文件大小归零:stat -c "%s" /var/log/syslog
4、对比替代方案:sudo > /var/log/nginx/access.log
五、统一归档旧日志至专用目录并设置访问控制
审计合规要求常需保留原始日志至少90天,但不得混存于主日志路径;olddir指令可将所有轮转出的归档集中移入隔离目录,并配合chmod/chown保障权限一致性。
1、创建受控归档路径:sudo mkdir -p /var/log/archive/app
2、赋予归档目录严格权限:sudo chmod 700 /var/log/archive/app && sudo chown root:adm /var/log/archive/app
3、在logrotate配置中加入指令:olddir /var/log/archive/app
4、确保新日志仍可正常创建:create 0644 app app
5、检查归档动作是否生效:sudo logrotate -d /etc/logrotate.d/app | grep "moving"










