一、背景问题
在生产环境中,随着服务持续运行,日志文件会不断累积,占用大量磁盘空间。以某开发测试服务器为例:
- 日志目录:
/data/logs - 服务数量:100+ 个微服务
- 磁盘占用:28g
- 待清理文件:24267 个(超过 7 天)
如果不及时清理,可能导致磁盘空间不足,影响服务正常运行。
二、日志目录分析
2.1 目录结构
/data/logs/ ├── cas_logs/ # cas认证服务日志 ├── nginx/ # nginx日志 ├── ttpt_cas/ # 平台cas日志 ├── yyzx_testservice_logs/ # 测试服务日志 ├── ... (100+ 服务目录) ├── spring.log # 散落的日志文件 └── spring.log.2025-12-31.log
2.2 日志文件命名规则
通过分析,发现日志文件主要有以下几种命名格式:
| 格式 | 示例 |
|---|---|
| 服务名-yyyy-mm-dd-hh-序号.log | cas-2022-01-04-11-1.log |
| 服务名.log.yyyy-mm-dd.log | ttpt_gmservice_logs.log.2026-01-08.log |
| access_log.yyyy-mm-dd.log | access_log.2026-01-08.log |
| *.gz | 压缩后的历史日志 |
三、解决方案设计
3.1 技术方案
使用 find + cron 组合实现自动化日志清理:
- find 命令:按文件类型和修改时间筛选日志文件
- cron 定时任务:每天定时执行清理脚本
- 日志记录:记录每次清理操作,便于追溯
3.2 安全措施
| 安全措施 | 说明 |
|---|---|
| 目录限制 | 只在 /data/logs 目录下操作 |
| 文件类型限制 | 只删除 *.log、*.log.*、*.gz 文件 |
| 只删文件 | 使用 -type f,不删除目录 |
| 时间限制 | 只删除 7 天前的文件(-mtime +7) |
| 操作日志 | 记录每次清理的时间和文件数量 |
四、实施步骤
4.1 创建脚本目录
mkdir -p /data/scripts
4.2 创建清理脚本
创建文件 /data/scripts/clean_old_logs.sh:
#!/bin/bash
#
# 日志清理脚本 - 删除7天前的日志文件
# 每天早上9点由cron定时执行
#
# 安全措施:
# 1. 只在 /data/logs 目录下操作
# 2. 只删除日志文件(*.log, *.log.*, *.gz)
# 3. 只删除文件,不删除目录
# 4. 记录清理日志
#
log_dir="/data/logs"
days=7
script_log="/data/scripts/clean_logs_history.log"
# 确保只在 /data/logs 目录下操作
if [ ! -d "$log_dir" ]; then
echo "$(date '+%y-%m-%d %h:%m:%s') - 错误: 目录 $log_dir 不存在" >> "$script_log"
exit 1
fi
# 记录开始时间
echo "$(date '+%y-%m-%d %h:%m:%s') - 开始清理 ${days} 天前的日志文件..." >> "$script_log"
# 统计将要删除的文件数量
count=$(find "$log_dir" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +$days 2>/dev/null | wc -l)
# 删除日志文件
find "$log_dir" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +$days -delete 2>/dev/null
# 记录完成
echo "$(date '+%y-%m-%d %h:%m:%s') - 清理完成,共删除 $count 个文件" >> "$script_log"4.3 赋予执行权限
chmod +x /data/scripts/clean_old_logs.sh
4.4 配置 cron 定时任务
# 添加定时任务(每天早上9点执行) (crontab -l 2>/dev/null | grep -v "clean_old_logs.sh"; echo "0 9 * * * /bin/bash /data/scripts/clean_old_logs.sh") | crontab - # 验证是否添加成功 crontab -l
cron 表达式说明:
0 9 * * * /bin/bash /data/scripts/clean_old_logs.sh │ │ │ │ │ │ │ │ │ └── 星期几 (0-7, 0和7都表示周日) │ │ │ └──── 月份 (1-12) │ │ └────── 日期 (1-31) │ └──────── 小时 (0-23) └────────── 分钟 (0-59)
五、验证与测试
5.1 预览待删除文件
# 查看将被删除的文件数量 find /data/logs -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +7 2>/dev/null | wc -l # 查看部分文件列表 find /data/logs -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) -mtime +7 2>/dev/null | head -20
5.2 手动执行测试
# 执行清理脚本 /bin/bash /data/scripts/clean_old_logs.sh # 查看清理记录 cat /data/scripts/clean_logs_history.log # 查看磁盘使用变化 du -sh /data/logs
5.3 查看 cron 执行日志
# 查看系统 cron 日志 tail -f /var/log/cron # 查看清理历史记录 cat /data/scripts/clean_logs_history.log
六、find 命令详解
6.1 核心参数说明
| 参数 | 说明 |
|---|---|
-type f | 只匹配文件,不匹配目录 |
-name "*.log" | 匹配文件名模式 |
-o | 逻辑或,连接多个匹配条件 |
-mtime +7 | 修改时间超过 7 天 |
-delete | 删除匹配的文件 |
2>/dev/null | 忽略权限不足等错误信息 |
6.2 时间参数对比
| 参数 | 含义 |
|---|---|
-mtime +7 | 修改时间 > 7 天前 |
-mtime 7 | 修改时间 = 7 天前 |
-mtime -7 | 修改时间 < 7 天前(7 天内) |
-atime | 访问时间 |
-ctime | 状态改变时间 |
七、排除或指定目录清理
7.1 如何排除某些目录不清理?
在 find 命令中添加 -not -path 参数:
find "$log_dir" -type f \
-not -path "*/kafka-logs/*" \
-not -path "*/nginx/*" \
\( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) \
-mtime +$days -delete7.2 如何只清理特定服务的日志?
修改 log_dir 或添加路径过滤:
# 只清理特定服务 log_dir="/data/logs/yyzx_testservice_logs" # 或使用通配符匹配多个服务 find /data/logs/yyzx_* -type f -name "*.log" -mtime +7 -delete
八、总结
本方案通过 find + cron 实现了服务器日志的自动化清理:
| 项目 | 配置 |
|---|---|
| 清理目录 | /data/logs |
| 保留天数 | 7 天 |
| 执行时间 | 每天 09:00 |
| 清理记录 | /data/scripts/clean_logs_history.log |
核心优势:
- ✅ 自动化执行,无需人工干预
- ✅ 安全限制,避免误删重要文件
- ✅ 操作留痕,便于问题追溯
- ✅ 配置灵活,易于调整参数
以上就是linux服务器使用cron实现日志自动清理方案的详细内容,更多关于linux cron日志自动清理的资料请关注代码网其它相关文章!
发表评论