在日常服务器运维中,磁盘空间不足是最常见的问题之一。当 /var 分区告急时,清理日志文件是最直接有效的解决方案。本文详细介绍 CentOS 系统中各类日志的清理方法,帮助你快速释放空间。
为什么日志会占满磁盘?
Linux 系统在运行过程中会产生大量日志,记录内核、服务、应用的各种信息。常见占用空间的日志来源包括:
- 系统日志:
/var/log/messages、/var/log/secure - 应用日志:Nginx、Apache、MySQL 等服务日志
- 历史日志:旧的日志压缩包(
.gz文件) - 定时任务日志:cron 执行记录
- yum 日志:软件包更新记录
如果长期不清理,单个日志文件可能膨胀到数 GB。
一、查看磁盘与日志占用情况
清理之前,先定位最大的文件:
# 查看磁盘使用情况
df -h
# 定位大文件(查看 /var 目录下的最大文件)
du -sh /var/log/* | sort -hr | head -20
# 查看具体的日志文件大小
ls -lhS /var/log/*.log
典型输出中,以下目录往往是空间大户:
| 目录 | 说明 |
|---|---|
/var/log/messages |
系统主日志 |
/var/log/maillog |
邮件日志 |
/var/log/cron |
计划任务日志 |
/var/log/audit |
审计日志 |
二、清理日志文件的几种方法
方法1:清空日志文件内容(保留文件)
适用于不想删除文件但需要释放空间的情况:
# 清空 messages 日志
> /var/log/messages
# 清空多个日志文件
> /var/log/secure
> /var/log/maillog
> /var/log/cron
# 查看清理后效果
df -h /var
原理:使用重定向 > 清空文件内容,文件本身保留,inode 不变,进程无需重启。
方法2:删除旧日志并重启日志服务
删除压缩的历史日志后,重启 rsyslog 服务:
# 删除旧的压缩日志(保留最近7天)
find /var/log -name "*.gz" -mtime +7 -delete
# 删除超过30天的日志文件
find /var/log -name "*.log.*" -mtime +30 -delete
# 重启日志服务使新文件生效
systemctl restart rsyslog
⚠️ 注意:直接删除
.log文件而不重启服务,新日志可能无法写入。建议配合systemctl restart rsyslog使用。
方法3:配置 logrotate 自动清理
logrotate 是 Linux 自带的日志轮转工具,配置文件位于 /etc/logrotate.conf:
# 查看 logrotate 配置
cat /etc/logrotate.conf
# 编辑 Nginx 日志轮转规则
vim /etc/logrotate.d/nginx
示例配置(每周轮转,保留4周,压缩旧日志):
/var/log/nginx/*.log {
weekly
rotate 4
compress
missingok
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
手动执行测试:
logrotate -d /etc/logrotate.d/nginx # 调试模式,不实际执行
logrotate -f /etc/logrotate.d/nginx # 强制执行
方法4:清理 journal 系统日志
systemd-journald 会持续积累日志,需要定期清理:
# 查看 journal 日志大小
du -sh /var/log/journal
# 保留最近14天的日志
journalctl --vacuum-time=14d
# 或者限制日志最大为 500MB
journalctl --vacuum-size=500M
# 查看当前保留策略
cat /etc/systemd/journald.conf
建议在 /etc/systemd/journald.conf 中添加:
[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M
RuntimeMaxUse=200M
方法5:清理 yum/dnf 更新日志
软件更新缓存也会占用不少空间:
# 清理旧的内核(保留当前内核)
package-cleanup --oldkernels --count=1
# 清理 yum/dnf 缓存
yum clean all # CentOS 7
dnf clean all # CentOS 8+
# 查看缓存大小
du -sh /var/cache/yum
du -sh /var/cache/dnf
三、一键清理脚本(推荐)
将以下脚本保存为 /root/clean_logs.sh,可快速执行常规清理:
#!/bin/bash
LOGDATE=$(date +%Y%m%d_%H%M%S)
echo "===== CentOS 日志清理开始: $LOGDATE ====="
# 1. 清理旧日志(保留7天)
find /var/log -name "*.gz" -mtime +7 -delete
find /var/log -name "*.log.*" -mtime +7 -delete
# 2. 清空主日志文件
> /var/log/messages
> /var/log/secure
> /var/log/maillog
> /var/log/cron
# 3. 清理 journal(保留14天)
journalctl --vacuum-time=14d
# 4. 清理 yum 缓存
yum clean all 2>/dev/null
# 5. 重启日志服务
systemctl restart rsyslog 2>/dev/null
echo "===== 清理完成,当前磁盘使用情况 ====="
df -h /var
执行并加入定时任务:
chmod +x /root/clean_logs.sh
# 每周日凌晨3点自动执行
echo "0 3 * * 0 /root/clean_logs.sh >> /var/log/clean.log 2>&1" | crontab -
四、排查与预防建议
快速定位占用空间最大的目录:
du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -10
定期检查策略:
| 周期 | 操作 |
|---|---|
| 每天 | 检查磁盘使用率(df -h) |
| 每周 | 检查大日志文件(du -sh /var/log/*) |
| 每月 | 执行日志轮转检查,清理旧压缩包 |
告警设置:
# 磁盘使用率超过85%时发邮件告警
echo "df -h | awk '{if (\$5>85) print \$0}'" | crontab -
五、总结
CentOS 日志清理的核心命令总结:
# 快速释放空间(最常用)
> /var/log/messages && systemctl restart rsyslog
# 配合旧日志清理
find /var/log -name "*.gz" -mtime +7 -delete
# 清理 journal
journalctl --vacuum-time=14d
通过合理配置 logrotate 并建立定期清理机制,可以从根本上避免磁盘空间告急。建议将清理脚本加入 crontab 定时执行,实现无人值守的日志管理。