Linux服務器使用Cron實現日志自動清理方案
一、背景問題
在生產環(huán)境中,隨著服務持續(xù)運行,日志文件會不斷累積,占用大量磁盤空間。以某開發(fā)測試服務器為例:
- 日志目錄:
/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 日志文件命名規(guī)則
通過分析,發(fā)現日志文件主要有以下幾種命名格式:
| 格式 | 示例 |
|---|---|
| 服務名-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 定時任務:每天定時執(zhí)行清理腳本
- 日志記錄:記錄每次清理操作,便于追溯
3.2 安全措施
| 安全措施 | 說明 |
|---|---|
| 目錄限制 | 只在 /data/logs 目錄下操作 |
| 文件類型限制 | 只刪除 *.log、*.log.*、*.gz 文件 |
| 只刪文件 | 使用 -type f,不刪除目錄 |
| 時間限制 | 只刪除 7 天前的文件(-mtime +7) |
| 操作日志 | 記錄每次清理的時間和文件數量 |
四、實施步驟
4.1 創(chuàng)建腳本目錄
mkdir -p /data/scripts
4.2 創(chuàng)建清理腳本
創(chuàng)建文件 /data/scripts/clean_old_logs.sh:
#!/bin/bash
#
# 日志清理腳本 - 刪除7天前的日志文件
# 每天早上9點由cron定時執(zhí)行
#
# 安全措施:
# 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"
?
# 統(tǒng)計將要刪除的文件數量
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 賦予執(zhí)行權限
chmod +x /data/scripts/clean_old_logs.sh
4.4 配置 Cron 定時任務
# 添加定時任務(每天早上9點執(zhí)行) (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 手動執(zhí)行測試
# 執(zhí)行清理腳本 /bin/bash /data/scripts/clean_old_logs.sh ? # 查看清理記錄 cat /data/scripts/clean_logs_history.log ? # 查看磁盤使用變化 du -sh /data/logs
5.3 查看 Cron 執(zhí)行日志
# 查看系統(tǒng) 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 | 狀態(tài)改變時間 |
七、排除或指定目錄清理
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 天 |
| 執(zhí)行時間 | 每天 09:00 |
| 清理記錄 | /data/scripts/clean_logs_history.log |
核心優(yōu)勢:
- ? 自動化執(zhí)行,無需人工干預
- ? 安全限制,避免誤刪重要文件
- ? 操作留痕,便于問題追溯
- ? 配置靈活,易于調整參數
以上就是Linux服務器使用Cron實現日志自動清理方案的詳細內容,更多關于Linux Cron日志自動清理的資料請關注腳本之家其它相關文章!
相關文章
Ubuntu安裝scrcpy完成手機投屏和控制(Ubuntu用QQ微信的另一種方法)
這篇文章主要介紹了Ubuntu安裝scrcpy手機投屏和控制(Ubuntu用QQ微信的另一種方法),這樣的話不用頻繁在鍵盤和手機間切換了 ,需要的朋友可以參考下2019-10-10

