把項目開發完成,部署到linux環境後,如果本身的平台沒有提供日誌自動備份功能,那麼我們可能需要編寫指令碼,並且使用linux內建的crontab進行定時清理和備份日誌的工作。
以下就是本人所編寫的較為通用的日誌清理指令碼以及crontab配置說明。
清理指令碼的設計思路如下:
1、指令碼可以根據參數去備份對應目錄下面的記錄檔
2、指令碼可以根據參數去匹配對應日期格式的記錄檔
3、指令碼可以參數化需要備份的周期(天)
4、指令碼可以參數化需要保留日誌目錄裡面的日誌資訊周期(天)
5、指令碼可以參數化存放備份日誌的目錄位址
下面是指令碼源碼
#!/bin/bash -e
#date 2015-12-04
#by duzx
#date 2015-12-23
#by duzx
#desc 修複了當天沒有日誌時,沒刪除前n天的日誌bug
#指令碼名稱 clean_log.sh
#邏輯說明
#0、初始化參數資料
#1、進入日誌目錄
#2、尋找昨天的記錄檔,並統計數量
#3、判斷需要備份的記錄檔數量大於等於1
#4、把昨日的記錄檔tar包
#5、gzip壓縮tar包
#6、刪除tar包和昨日的記錄檔
#7、清理n日前的記錄檔
#8、清理n日前的備份記錄檔
#9、指令碼完成
#參數說明
#$1--需要備份的日誌目錄位址.如/usr/local/apache/logs
#$2--存放備份日誌壓縮包的的目錄位址。如/usr/local/apache/logs/baklogs
#$3--備份日誌儲存的時間(天)如30
#$4--指令碼操作的日誌記錄存放目錄位址。如/usr/local/apache/bin
#$5--日期格式如%Y%m%d
#$6--保留原始記錄檔的天數如 7
###########################################
if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ] || [ ! -n "$4" ] || [ ! -n "$5" ] || [ ! -n "$6" ];
then
echo "參數輸入缺失,請補充後再試。"
echo "需要備份的日誌目錄位址.如/usr/local/apache/logs"
echo "存放備份日誌壓縮包的的目錄位址。如/usr/local/apache/logs/baklogs"
echo "備份日誌儲存的時間(天)如30"
echo "指令碼操作的日誌記錄存放目錄位址。如/usr/local/apache/bin"
echo "日期格式如%Y%m%d"
echo "保留原始記錄檔的天數如 7"
exit 0
fi
declare -r today=$(date +%Y%m%d_%H%M%S)
declare -r yesterday=$(date -d '1 day ago' +$5)
declare -r cleanday=$(date -d $6' day ago' +$5)
cleanlog=$4/clean_log.log
if [ ! -d $4 ];
then
mkdir $4 -p
echo "指令碼日誌存放目錄不存在,建立戒備日誌存放目錄成功"
fi
echo "${today}:" >>$cleanlog
echo "1 準備備份$yesterday的日誌記錄" >>$cleanlog
logdir=$1
baklogs=$2
bakdays=$3
echo "2 初始化資料完成" >>$cleanlog
cd ${logdir}
echo "3 進入日誌目錄" >>$cleanlog
declare -r filesum=$(ls *${yesterday}* | wc -l)
echo "4 統計昨日的日誌記錄數量為$filesum個記錄檔" >>$cleanlog
if [ ! -d ${baklogs} ];
then
echo "5 備份記錄檔目錄不存在">>$cleanlog
mkdir ${baklogs} -p >>$cleanlog
echo "6 建立記錄檔目錄$baklogs 成功。">>$cleanlog
fi
if [ "${filesum}" -ge 1 ];then
echo "7 開始打包記錄檔">>$cleanlog
tar -cvf ${yesterday}.log.tar *${yesterday}* >>$cleanlog
echo "8 打包成功">>$cleanlog
echo "9 開始壓縮記錄檔">>$cleanlog
gzip ${yesterday}.log.tar >>$cleanlog
echo "10 壓縮成功">>$cleanlog
echo "11 開始備份日誌目錄">>$cleanlog
mv ${yesterday}.log.tar.gz $baklogs >>$cleanlog
echo "12 轉移壓縮記錄檔成功">>$cleanlog
echo "13 開始清理$6日前的記錄檔">>$cleanlog
rm -rf $(ls -tr *${cleanday}*)>>$cleanlog
echo "14 清理$6日前的記錄檔成功">>$cleanlog
else
echo "$6日前的日誌為空白。">>$cleanlog
echo "13 開始清理$6日前的記錄檔">>$cleanlog
rm -rf $(ls -tr *${cleanday}*)>>$cleanlog
echo "14 清理$6日前的記錄檔成功">>$cleanlog
exit 0
fi
echo "15 準備清理${bakdays}天前的記錄備份檔案">>$cleanlog
cd ${baklogs}
echo "16 進入備份目錄">>$cleanlog
declare -r baksum=$(ls * | wc -l)>>$cleanlog
if [ "${baksum}" -gt ${bakdays} ];
then
declare -i delsum=${baksum}-${bakdays}
declare -r delbakfiles=$(ls -tr *.gz | sort | head -n ${delsum})
echo "17 統計需要清理的備份記錄檔如下:">>$cleanlog
echo "${delbakfiles}" >>$cleanlog
echo "18 開始清理備份日誌">>$cleanlog
rm -rf ${delbakfiles}
echo "19 清理備份日誌成功">>$cleanlog
else
echo "記錄檔數量${baksum}個,未超出需要清理的限額">>$cleanlog
fi
echo "end">>$cleanlog
############################################
##指令碼完成
下面是配置sh指令碼的操作許可權
chmod 755 clean_log.sh
下面是配置crontab
進入linux作業系統
輸入 crontab -e
進入crontab編輯模式,輸入以下內容(我定義的是每天淩晨1點0分0秒執行定時任務)
0 1 * * * /usr/local/apache/bin/clean_log.sh /usr/local/apache/logs /usr/local/apache/logs/baklogs 30 /usr/local/apache/bin \%Y\%m\%d 7
其中需要注意的是,參數裡面有%,所以需要使用反斜線進行處理下。