#!/bin/bash
# 介紹:logcut.sh 簡單的日誌切割腳本,前3天的切割方便隨時看,前4-10天的進行壓縮,超出的刪除
#
# 注意:會將其他帶時間的日誌壓縮後刪除
# 功能:日誌切割 <日誌格式: xxxxx.當前年-月-日.log> <壓縮格式: xxxxx.當前年-月-日.tar.gz>
#
# 適用:centos6+
# 語言:中文
#流程
#主體:先檢查是否是log文件,是則檢查是否是切割後文件,不是則去切割,是則檢查時間是否3天內的,3天外則壓縮
#切割:檢查是否有這個文件,有則將日誌重定向到切割後的文件,清空日誌。沒有則複製一份,清空日誌
#壓縮:檢查是否有這個文件,有則刪除。壓縮文件,並刪除源文件
#檢查壓縮:檢查是否有tar.gz結尾文件,有則匹配是否帶時間,帶時間則看是否超過10天,超過刪除。不帶時間則跳過
#[使用設置]
#日誌文件所在目錄,將切割這個文件夾下所有日誌
log_dir=/ops/logs
#以切割形式保存的文件天數
date_cut=3
#以壓縮形式保存的天數
date_yasuo=7
#[自動獲取]
#當前年月日
date_now=`date +%F`
#當前年月
date_nian=`date +%Y-`
#前3天數組
date_cut_zu=($(for i in `seq 1 ${date_cut}`;do date -d -${i}days "+%F";done))
#前10天數組
date_time=`expr $date_cut + $date_yasuo`
date_yasuo_zu=($(for i in `seq 1 ${date_time}`;do date -d -${i}days "+%F";done))
#對日誌名進行格式處理,$1填寫要處理的文件
Format_Name() {
local a=`echo ${1%%.log}`
local b=`echo ${a%%-log}`
echo $b
}
#對傳入的日誌文件進行切割處理,$1填寫要切割文件
Cut_Log() {
local file=`Format_Name $1`
local cut_file="${file}.${date_now}.log"
#先匹配是否已經有這個文件
ls | grep "^${cut_file}$" &> /dev/null
if [[ $? -eq 0 ]];then
cat $1 >> $cut_file
> $1
else
cp -p $i $cut_file
> $1
fi
}
#對當前文件進行壓縮,$1填寫要被壓縮的文件
Yasuo_Log() {
local file=`Format_Name $1`
local yasuo_file="${file}.log.tar.gz"
#先匹配是否已經有這個文件
ls | grep "^${yasuo_file}$" &> /dev/null
if [[ $? -eq 0 ]];then
#有則刪除,刪除的都是3天中的,刪除後從新打包
rm -rf $yasuo_file
fi
tar -cf $yasuo_file $1
rm -rf $i
}
#整理日誌文件
Cut_Main() {
#獲取所有日誌文件,不包含壓縮文件
for i in `ls | grep .log$`
do
#挑出當月的日誌文件,否則去壓縮
echo $i | grep ${date_nian} &> /dev/null
if [[ $? -eq 0 ]];then
local a=`Format_Name $i`
local b=`echo ${a:(-10)}` #當前日誌年月日
#看是否在數組中,不在則壓縮
echo ${date_cut_zu[*]} |grep -w $b &> /dev/null
#echo $date_now
if [[ $? -ne 0 ]];then
[[ "$b" != "$date_now" ]] && Yasuo_Log $i
fi
else
Cut_Log $i
fi
done
}
#整理壓縮的日誌文件
Yasuo_Main() {
#獲取所有壓縮包
for i in `ls | grep .tar.gz$`
do
echo $i | grep ${date_nian} &> /dev/null
if [[ $? -eq 0 ]];then
local a=`echo ${i%%.log.tar.gz}`
local b=`echo ${a:(-10)}` #當前日誌年月日
#看是否在數組中,不在則刪除
echo ${date_yasuo_zu[*]} |grep -w $b &> /dev/null
if [[ $? -ne 0 ]];then
[[ "$b" != "$date_now" ]] && rm -rf $i
fi
else
#不是當月的,其他類型壓縮包,跳過
continue
fi
done
}
#開始
if [[ ! -d $log_dir ]];then
echo "$log_dir not found"
exit 1
fi
cd $log_dir
Cut_Main
Yasuo_Main
© 2020 GitHub, Inc.
shell腳本--------日誌切割
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.