CentOS日志清理完全指南:快速释放磁盘空间

在日常服务器运维中,磁盘空间不足是最常见的问题之一。当 /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 定时执行,实现无人值守的日志管理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注