linux下的通用記錄備份指令碼__linux

來源:互聯網
上載者:User

把項目開發完成,部署到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

其中需要注意的是,參數裡面有%,所以需要使用反斜線進行處理下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.