把项目开发完成,部署到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
其中需要注意的是,参数里面有%,所以需要使用反斜杠进行处理下。