linux下的通用日志备份脚本

来源:互联网 发布:宁知此为归骨所耶翻译 编辑:程序博客网 时间:2024/04/19 18:00

把项目开发完成,部署到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

#5gzip压缩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编辑模式,输入以下内容(我定义的是每天凌晨100秒执行定时任务)


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

其中需要注意的是,参数里面有%,所以需要使用反斜杠进行处理下。

0 0
原创粉丝点击