推荐方法:使用 logrotate 自动轮替日志
适用场景:生产环境长期维护
原理:Linux 内置的 logrotate 工具通过定时任务(cron)自动压缩、归档或删除旧日志,避免手动操作风险。
操作步骤:  
- 编辑配置文件
sudo vim /etc/logrotate.conf # 全局配置 sudo vim /etc/logrotate.d/custom # 应用专属配置(如Nginx/Apache) 
- 典型配置示例(以Nginx日志为例):
/var/log/nginx/*.log { daily # 每天轮替 rotate 30 # 保留30份旧日志 compress # 压缩归档文件(节省空间) delaycompress # 延迟压缩(避免影响当前日志) missingok # 日志不存在时不报错 notifempty # 空日志不轮替 create 0640 nginx adm # 新日志文件权限 postrotate /usr/bin/systemctl reload nginx # 轮替后重启服务 endscript }
- 手动触发测试:
sudo logrotate -f /etc/logrotate.d/custom # -f 强制立即执行 优势: 
- 自动化管理,避免磁盘爆满
- 保留历史日志供审计
- 通过 postrotate确保服务连续性
手动清理方法(谨慎使用)
清空当前日志文件
适用场景:临时释放空间,且日志文件正被进程占用
# 或 sudo truncate -s 0 /var/log/kern.log
注意:直接 rm 删除可能导致服务写入失败,推荐清空而非删除。
按时间删除旧日志
适用场景:清理指定目录的历史日志
# 删除/var/log目录下超过30天的.log文件 sudo find /var/log -name "*.log" -type f -mtime +30 -delete
参数说明:
- -mtime +30:修改时间超过30天
- -exec rm {} \;替代- -delete可更兼容旧系统
使用 journalctl 清理系统日志
适用场景:Systemd 系统的日志管理
# 清理超过50MB的日志 sudo journalctl --vacuum-size=50M # 清理7天前的日志 sudo journalctl --vacuum-time=7d
关键注意事项
- 备份重要日志:
 清理前确认日志无价值,必要时备份:sudo cp -a /var/log/nginx/access.log /backup/ 
- 避免误删系统日志:
- 不删除 /var/log下非日志文件(如wtmp、btmp)
- 禁用 rm -rf /var/log/*等危险命令
 
- 不删除 
- 检查磁盘空间:
 清理后使用df -h确认空间释放,du -sh /var/log查看日志目录大小。
- 服务兼容性:
 如使用 Elasticsearch 或 Splunk,需在配置中设置日志保留策略,而非直接删除文件。
最佳实践总结
| 场景 | 推荐方法 | 频率 | 
|---|---|---|
| 长期维护的服务器 | logrotate 自动轮替 | 每日/每周 | 
| 紧急释放磁盘空间 | 清空文件( :>或truncate) | 手动触发 | 
| 清理历史归档日志 | find按时间删除 | 每月/季度 | 
重要提示:
- 清理前停止相关服务(如Web服务器、数据库)可避免文件锁冲突。
- 对于Docker容器,需在容器内配置日志驱动(
json-file的max-size选项)或宿主机的logrotate。- 企业环境建议搭配监控工具(如Zabbix),当磁盘使用率>80%时自动触发清理脚本。
通过合理配置 logrotate 和定期维护,可从根本上解决日志膨胀问题,确保系统稳定运行。
引用说明:
- Linux logrotate官方文档:https://linux.die.net/man/8/logrotate
- Systemd journalctl手册:https://www.freedesktop.org/software/systemd/man/journalctl.html
- 文件删除风险参考:Linux Filesystem Hierarchy Standard (FHS)
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9357.html
 
                 
        