Linux磁盘空间急救指南5步精准定位并清理超1GB日志文件当服务器突然告警磁盘空间不足时作为运维人员的你该如何快速应对本文将带你深入实战通过一系列高效命令组合和自动化脚本精准定位那些空间吞噬者——尤其是常见的日志文件并安全释放宝贵磁盘空间。1. 快速诊断全局磁盘使用概览在开始清理之前我们需要先了解整个系统的磁盘使用情况。就像医生看病要先做全面检查一样以下命令能让你快速掌握全局df -hT这个命令会显示所有挂载点的使用情况关键列包括Filesystem磁盘分区Type文件系统类型Size总容量Used已用空间Avail可用空间Use%使用百分比Mounted on挂载点提示重点关注Use%超过80%的分区特别是/var和/目录它们通常是日志和系统文件的聚集地。如果想查看更详细的inode使用情况当磁盘未满但无法创建新文件时可能需要df -i2. 深度扫描定位大文件和目录2.1 查找大目录的黄金组合发现空间不足的分区后使用这个经典命令组合快速定位罪魁祸首du -h --max-depth1 /path/to/directory | sort -hr | head -n 20参数解析du -h以人类可读格式显示磁盘使用情况--max-depth1只显示指定目录的直系子目录sort -hr按人类可读的数字大小逆序排序head -n 20只显示前20个结果例如检查/var目录sudo du -h --max-depth1 /var | sort -hr | head -n 10典型输出示例12G /var/log 8.4G /var/lib 1.2G /var/cache 756M /var/www2.2 精准查找大文件的终极命令当需要精确查找超过特定大小的文件时find命令是更强大的工具sudo find /path/to/search -type f -size 1G -exec ls -lh {} | sort -k5 -hr这个复杂命令的分解find /path/to/search在指定路径下搜索-type f只查找文件排除目录-size 1G大小超过1GB的文件-exec ls -lh {} 对找到的每个文件执行ls -lh命令sort -k5 -hr按第5列文件大小逆序排序实际案例查找/var/log下所有超过500MB的日志文件sudo find /var/log -type f -size 500M -exec ls -lh {} | sort -k5 -hr3. 日志文件专项清理策略3.1 常见日志文件位置及清理方法不同服务的日志位置和清理方式各异这里列出最常见的几种服务类型典型日志位置清理方法系统日志/var/log/messages使用logrotate或手动清空Apache/Nginx/var/log/httpd/*配置日志轮转或使用truncate命令MySQL/var/log/mysql/*清理慢查询日志和错误日志Docker/var/lib/docker/containers配置日志驱动限制大小应用日志/var/log/app/*使用应用的日志管理功能3.2 安全清理日志的几种方式方法一使用truncate命令保留文件sudo truncate -s 0 /var/log/large-log-file.log方法二使用logrotate推荐创建自定义logrotate配置/etc/logrotate.d/myapp/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 644 root root postrotate /usr/bin/systemctl reload myapp.service /dev/null endscript }然后手动执行测试sudo logrotate -vf /etc/logrotate.d/myapp方法三按时间清理删除7天前的日志sudo find /var/log -name *.log -type f -mtime 7 -delete4. 自动化清理脚本实战4.1 智能清理脚本示例将以下脚本保存为/usr/local/bin/cleanup_logs.sh#!/bin/bash # 定义阈值单位MB THRESHOLD1024 # 1GB LOG_DIR/var/log echo 开始磁盘空间检查... CURRENT_USAGE$(df / | awk NR2 {print $5} | tr -d %) if [ $CURRENT_USAGE -gt 80 ]; then echo 警告根分区使用率已达${CURRENT_USAGE}%开始清理... # 查找大日志文件 LARGE_FILES$(find $LOG_DIR -type f -size ${THRESHOLD}M -exec ls -lh {} | sort -k5 -hr) if [ -n $LARGE_FILES ]; then echo 发现以下大文件 echo $LARGE_FILES # 安全清理保留文件但清空内容 while IFS read -r line; do FILE$(echo $line | awk {print $9}) echo 清空文件: $FILE truncate -s 0 $FILE done $LARGE_FILES else echo 未找到超过${THRESHOLD}MB的大文件。 fi # 清理旧日志30天前 find $LOG_DIR -name *.log -type f -mtime 30 -exec rm -f {} \; echo 清理完成。当前使用率$(df / | awk NR2 {print $5})% else echo 当前磁盘使用率正常${CURRENT_USAGE}% fi4.2 设置定时任务让脚本每天自动运行sudo chmod x /usr/local/bin/cleanup_logs.sh sudo crontab -e添加以下行每天凌晨2点运行0 2 * * * /usr/local/bin/cleanup_logs.sh /var/log/cleanup.log 215. 高级技巧与预防措施5.1 使用ncdu进行交互式分析对于喜欢可视化操作的用户ncdu工具是不二之选sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # CentOS/RHEL ncdu /var/log操作指南使用方向键导航按d删除选中文件/目录按n按文件名排序按s按文件大小排序5.2 预防日志膨胀的最佳实践合理配置日志级别生产环境避免使用DEBUG级别实施日志轮转所有服务都应配置logrotate使用集中式日志考虑ELK或Graylog等方案监控磁盘空间设置Prometheus或Zabbix告警容器日志管理为Docker配置日志驱动和大小限制# Docker日志限制示例在daemon.json中配置 { log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }5.3 系统日志(journald)专项优化对于使用systemd的系统journal日志也可能占用大量空间# 检查journal当前占用空间 journalctl --disk-usage # 只保留最近2天的日志 sudo journalctl --vacuum-time2d # 或限制总大小不超过500MB sudo journalctl --vacuum-size500M # 永久配置编辑/etc/systemd/journald.conf SystemMaxUse500M