shell脚本----周期压缩备份日志文件
一、日志文件样式
二、目标
1、备份压缩.log结尾&&时间样式为“date +%Y%m%d”的日志文件(如:20170912、20160311等)
2、可指定压缩范围(N天前至当天):如:今天、昨天(date -d "-1 day" +%Y%m%d)至今天、前天至今天
压缩命名格式为:日期.tar.gz(或:日期.tar.bz2),压缩N天范围内文件后将会生成N个压缩包
3、可指定压缩模式(二选一):tar czf 或 tar cjf
4、可指定删除范围:删除N天前的日志文件,如:今天为20170912,删除3天前日志,即删除20170908及其以前的日志文件
5、每周五(不一定周五,可在脚本中指定周几打包)将压缩文件打包(打包成功后删除压缩文件),并上传到日志服务器,上传成功后删除打包文件
6、默认备份当天日志文件,压缩模式为“czf”,删除三天前日志文件
三、脚本内容
#!/bin/bash
#author:xiami
#date:
#description: compress files of a specified mode and delete logs before a particular date
#version:v0. strategy_logs_path="/root/apps/myapp/log"
date=$(date +%Y%m%d) #------------初始化函数默认参数----------
init_argv(){ #example:init_argv -d -m cjf -r 打包压缩近四天及当天日志,压缩模式cjf,删除五天前日志
compress_date=$(date +%Y%m%d)
backup_mode="czf"
del_days_num=
backup_path="/root/apps/logs_backup"
line=$(ps -ef |grep "ssh-agent"|awk '{if($0!~/grep ssh-agent/)print $0}'|wc -l)
while getopts d:m:r: opt
do
case $opt in
d) compress_days="$OPTARG" ;;
m) backup_mode="$OPTARG" ;;
r) del_days_num="$OPTARG" ;;
\?) echo "Usage: `basename $0` [d|m|r]"
echo "-d 'Integer' (tar & compress Integer day logfile)"
echo "-m 'czf|cjf' (mode)"
echo "-r 'Interger' (remove files Integer days ago)"
exit ;;
esac
done
if [ ! -d "$backup_path" ];then
mkdir -p $backup_path
fi
# if [ line -lt ];then
# echo "Not running ssh-agent"
# exit
# fi
}
#------------打包并压缩日志文件操作函数--------------------
tar_compress_log(){ #参数1:压缩日期 参数2:压缩备份模式
local compress_date="$1"
local backup_mode="$2"
cd "$strategy_logs_path"
# ls . -name "*$date*.log"|xargs tar $backup_mode "$date.tar.gz" #压缩当天日志
if [ "$backup_mode" == 'czf' ];then
ls | grep ".*[0-9]\{8\}.*\.log$"|grep ".*"$compress_date".*"|xargs tar $backup_mode "$backup_path/"$".tar.gz"
elif [ "$backup_mode" == 'cjf' ];then
ls | grep ".*[0-9]\{8\}.*\.log$"|grep ".*"$compress_date".*"|xargs tar $backup_mode "$backup_path/"$".tar.bz2"
else
echo "tar mode error";exit
fi
}
#------------打包并压缩N天前到当前日期范围的日志文件----------
compress_range_date(){ #参数1:压缩备份天数 参数2:压缩备份模式
local dates="$date"
local compress_days="$1"
local backup_mode="$2"
if [[ ! -z "$compress_days" && "$compress_days" -ne ]];then
for i in `seq "$compress_days"`;do
dates=$(date -d "-$i day" +%Y%m%d)
# n=$(echo $dates|awk '{print NF}')
tar_compress_log "$dates" "$backup_mode"
done
else
tar_compress_log "$dates" "$backup_mode"
fi
}
#------------每周五打包当周压缩文件并在打包成功后删除单个压缩文件------------
tar_file(){
weekday=$(date +%u)
if [ "$weekday" -eq ];then
cd "$backup_path"
ls|xargs tar cf "$date-Fri-logs.tar" && rm *.tar.?z*
fi
}
#-----------删除(del_log_days)天前日志文件(根据mtime)---------
delete_days_log1(){ #参数1:del_days_num
local del_days_num="$1"
cd "$strategy_logs_path"
find . -type f -mtime +$del_days_num |grep ".*[0-9]\{8\}.*\.log"|xargs rm aa -rf #删除操作,请谨慎
}
#----------删除(del_log_days)天前日志文件(根据log文件名)----
delete_days_log2(){ #参数1:del_days_num
local del_days_num="$1"
cd "$strategy_logs_path"
local num=$(ls |grep ".*[0-9]\{8\}.*\.log$" |grep -o "[0-9]\{8\}"|awk '!day[$0]++'|wc -l)
local files=$(ls |grep ".*[0-9]\{8\}.*\.log$" |grep -o "[0-9]\{8\}"|awk '!day[$0]++')
if [ ! -z "$num" ];then
local field=""
for i in `seq "$num"`
do
field=$(echo $files|awk '{print $v}' v=$i)
if [ "$field" -lt $(date -d "-$del_days_num day" +%Y%m%d) ];then
ls *$field* |grep '.*[0-9]\{8\}.*\.log$'|xargs rm aa -rf
fi
done
fi
}
#-----------上传到日志服务器-------------
upload_tgz(){
scp $backup_path/$date.tar.gz 192.168.119.133:/opt/ && rm $backup_path/$date.tar.gz
#scp $backup_path/$date*-logs.tar 192.168.119.133:/opt/ && rm $backup_path/$date*-logs.tar
}
#-----------main-------------------------
main(){
init_argv $argv
compress_range_date "$compress_days" "$backup_mode"
delete_days_log2 $del_days_num
tar_file
# upload_tgz
}
#----------执行部分----------------------
argv=""
until [ "$#" -eq ];do
argv="$argv $1"
shift
done
main $argv
log_tar_clean.sh
四、运行脚本
日志文件初始数量为图一所示
4.1 带参数运行后
4.2 不带参数运行(默认情况,备份当天日志文件,压缩模式为“czf”,删除三天前日志文件)
为了使测试环境一致,首先恢复被删除日志文件,删除压缩文件
不带参数运行脚本
五、计划任务
略
脚本完善:
1、删除每天的日志文件,机器中只保留近N天(默认14天)的压缩文件
2、考虑到安全性,文件上传改为:远端日志服务器从机器拉取每天对应的日志文件,而不是机器主动上传。
3、一次备份多个目录下日志,目录列表存放于scan_logdir.inc
完善后脚本:
#!/bin/bash
#author:xiami
#date:
#description: compress files of a specified mode and delete logs before a particular date, reference: http://www.cnblogs.com/xiami-xm/p/7511087.html
#version:v0. date=$(date +%Y%m%d)
scan_log_dir="$(dirname $0)/scan_logdir.inc" #------------初始化函数默认参数----------
init_argv(){ #example:init_argv -d -m cjf -r 打包压缩近四天及当天日志,压缩模式cjf,删除五天前日志
compress_date=$(date +%Y%m%d)
backup_mode="cjf"
del_days_num=
backup_path="/root/apps/logs_backup"
stay_days=
line=$(ps -ef |grep "ssh-agent"|awk '{if($0!~/grep ssh-agent/)print $0}'|wc -l)
while getopts d:m:r:s: opt
do
case $opt in
d) compress_days="$OPTARG" ;;
m) backup_mode="$OPTARG" ;;
r) del_days_num="$OPTARG" ;;
s) stay_days="$OPTARG" ;;
\?) echo "Usage: `basename $0` [d|m|r]"
echo "-d 'Integer' (tar & compress Integer day logfile)"
echo "-m 'czf|cjf' (mode)"
echo "-r 'Interger' (remove files Integer days ago)"
exit ;;
esac
done
if [ ! -d "$backup_path" ];then
mkdir -p $backup_path
fi
}
#------------(实际操作函数)打包并压缩日志文件,压缩成功后立即将文件删除--------------------
tar_compress_log(){ #参数1:压缩日期 参数2:压缩备份模式
local compress_date="$1"
local backup_mode="$2"
local logs_path="$3"
cd "$logs_path"
# cd "$strategy_logs_path"
# ls . -name "*$date*.log"|xargs tar $backup_mode "$date.tar.gz" #压缩当天日志
if [ "$backup_mode" == 'czf' ];then
ls | grep ".*[0-9]\{8\}.*\.\(log\|csv\)$"|grep ".*"$compress_date".*"|xargs tar $backup_mode $backup_path/dir$a.$compress_date.tar.gz >/dev/null >& && ls | grep ".*[0-9]\{8\}.*\.\(log\|csv\)$"|grep ".*"$compress_date".*"|xargs rm -rf
elif [ "$backup_mode" == 'cjf' ];then
ls | grep ".*[0-9]\{8\}.*\.\(log\|csv\)$"|grep ".*"$compress_date".*"|xargs tar $backup_mode $backup_path/dir$a.$compress_date.tar.bz2 >/dev/null >& && ls | grep ".*[0-9]\{8\}.*\.\(log\|csv\)$"|grep ".*"$compress_date".*"|xargs rm -rf
else
echo "tar mode error";exit
fi
}
#------------检查scan_logdir.inc是否有数据-------------------
check_scan(){
local line=$(cat "$scan_log_dir" | wc -l)
if [ "$line" -eq ];then
exit ;
fi
}
#------------需要备份的日志目录-------------------------------
backup_all_logs_dir(){
check_scan
local a=
while read line;do
local logs_path="$line"
compress_range_date "$compress_days" "$backup_mode" "$logs_path"
# delete_days_log1 "$del_days_num" "$logs_path"
delete_days_log2 "$del_days_num" "$logs_path"
let a++;echo "-----------------$a----------------------------------"
done < "$scan_log_dir"
}
#------------打包并压缩N天前到当前日期范围的日志文件----------
compress_range_date(){ #参数1:压缩备份天数 参数2:压缩备份模式
local dates="$date"
local compress_days="$1"
local backup_mode="$2"
local logs_path="$3"
# if [[ ! -z "$compress_days" && "$compress_days" -ne ]];then
if [ ! -z "$compress_days" ];then
for i in `seq "$compress_days"`;do
dates=$(date -d "-$i day" +%Y%m%d)
# n=$(echo $dates|awk '{print NF}')
tar_compress_log "$dates" "$backup_mode" "$logs_path"
done
else
tar_compress_log "$dates" "$backup_mode" "$logs_path"
fi
}
#------------每周五打包当周压缩文件并在打包成功后删除单个压缩文件------------
tar_file(){
weekday=$(date +%u)
if [ "$weekday" -eq ];then
cd "$backup_path"
ls|xargs tar cf "$date-Fri-logs.tar" && rm *.tar.?z*
fi
}
#-----------只保留14天内的压缩日志文件------------------------------------
stay_tgz_log(){
local stay_days="$stay_days"
local rm_date=$(date -d "-$stay_days day" +%Y%m%d)
cd $backup_path
ls |grep -o "[0-9]\{8\}"|awk '!aa[$0]++'|while read line;do
if [ "$line" -le $rm_date ];then
ls *$line* |xargs rm -rf
fi
done }
#-----------删除(del_log_days)天前日志文件(根据mtime)---------
delete_days_log1(){ #参数1:del_days_num
local del_days_num="$1"
local logs_path="$2"
# cd "$strategy_logs_path"
cd "$logs_path"
find . -type f -mtime +$del_days_num |grep ".*[0-9]\{8\}.*\.\(log\|csv\)$"|xargs rm -rf #删除操作,请谨慎
}
#----------删除(del_log_days)天前日志文件(根据log文件名)----
delete_days_log2(){ #参数1:del_days_num
local del_days_num="$1"
local logs_path="$2"
# cd "$strategy_logs_path"
cd "$logs_path"
local num=$(ls |grep ".*[0-9]\{8\}.*\.\(log\|csv\)$" |grep -o "[0-9]\{8\}"|awk '!day[$0]++'|wc -l)
local files=$(ls |grep ".*[0-9]\{8\}.*\.\(log\|csv\)$" |grep -o "[0-9]\{8\}"|awk '!day[$0]++')
if [ ! -z "$num" ];then
local field=""
for i in `seq "$num"`
do
field=$(echo $files|awk '{print $v}' v=$i)
if [ "$field" -le $(date -d "-$del_days_num day" +%Y%m%d) ];then
ls *$field* |grep '.*[0-9]\{8\}.*\.\(log\|csv\)$'|xargs rm -rf
fi
done
fi
}
#-----------上传到日志服务器-------------
upload_tgz(){
scp $backup_path/$date.tar.gz 192.168.119.133:/opt/ && rm $backup_path/$date.tar.gz
#scp $backup_path/$date*-logs.tar 192.168.119.133:/opt/ && rm $backup_path/$date*-logs.tar
}
#-----------main-------------------------
main(){
init_argv $argv
backup_all_logs_dir
# compress_range_date "$compress_days" "$backup_mode"
# delete_days_log2 $del_days_num
stay_tgz_log $stay_days
# tar_file
# upload_tgz
}
#----------执行部分----------------------
argv=""
until [ "$#" -eq ];do
argv="$argv $1"
shift
done
main $argv
clean_log.sh
日志服务器拉取脚本:
#!/bin/bash
date=$(date +%Y%m%d)
remote_logs_backup=/root/apps/logs_backup
local_logs_backup=/root/apps/local_logs_backup
hostsfile="$(dirname $0)/hosts.inc"
while read line;do
if [ ! -d "$local_logs_backup/$line" ];then
mkdir -p "$local_logs_backup/$line"
fi
scp root@$line:$remote_logs_backup/*$date* $local_logs_backup/$line >/dev/null 2>&1
#&& ssh -nl root $line "rm $remote_logs_backup/* -rf" >/dev/null 2>&1 #ssh登陆或拷贝操作时若文件不存在会报错,可忽略
done < $hostsfile
pull_logs.sh
[root@xiamihost3 script]# cat hosts.inc
192.168.119.131 #hosts.inc中是目标机器的ip地址
192.168.119.133
基本功能已实现,但脚本还有待改进,例如脚本中使用的grep可以换成egrep,可以少一层转义。
上传备份功能还未进行测试,可能会出现错误,当然,上传前肯定得先将本地公钥放入服务器的authorized_keys文件中,实现ssh无密登陆。
最后想感慨一句,还是python更强大
good good study,day day up
shell脚本----周期压缩备份日志文件的更多相关文章
- shell脚本切割tomcat的日志文件
鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割tomcat下的日志文件(大家如果有在logback或log4j使用文件切割成功的话,可以留下使用方式,先谢 ...
- zabbix3.0.4通过自定义shell脚本添加对关键日志文件的监控
zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...
- 【shell脚本】定时备份日志===logBackup.sh
定时备份日志 设置执行权限 [root@VM_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [root@VM_0_10_centos sh ...
- shell脚本实现定时备份某文件
1:目标 实现在图像化界面输入需要备份的源文件路径.目标路径,定时的时间.然后通过输入的信息,把需要备份的源文件打包放到指定的目标路径下以执行定时任务的时间为子目录 把/she ...
- 使用shell脚本定时执行备份mysql数据库
使用shell脚本定时执行备份mysql数据库 #!/bin/bash ############### common file ################ #本机备份文件存放目录 MYSQLBA ...
- Shell脚本调用ftp上传文件
Shell脚本调用ftp上传文件 1.脚本如下 ftp -n<<! open x.x.x.x ###x.x.x.x为ftp地址 user username password ###user ...
- Centos上通过shell脚本实现数据库备份和还原
最近有个这样的需求,通过shell脚本实现数据库备份还原,最后通过网上查询自己测试实现,将脚本分享给大家 1.数据库备份脚本 #!/bin/bash ds=`` list=`date +%Y`/`da ...
- 用shell脚本实现定时备份数据库
1.备份数据库的方法 可以使用命令查看 ls /usr/local/mysql/bin 这个mysqldump就是系统内置的用来备份数据库的工具. 2.实现方法 ①先随便进入一个位置创建一个目录 ② ...
- shell脚本每天自动备份mysql数据库
一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...
随机推荐
- UE4 Notes
Unreal Engine 4 减少编辑器的帧率C:\Program Files\Epic Games\UE_4.19\Engine\Config\BaseEngine.ini[/Script/Unr ...
- 适用于 Windows 10 的触摸板手势
高级用户! 在 Windows 10 笔记本电脑的触摸板上试用这些手势: 选择项目:点击触摸板. 滚动:将两根手指放在触摸板上,然后以水平或垂直方向滑动. 放大或缩小:将两根手指放在触摸板上,然后收缩 ...
- adb获得安卓系统版本及截屏
[时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...
- Halcon中模板匹配方法的总结归纳
基于组件的模板匹配: 应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合. 算法步骤: 1.获取组件模型里的初始控件 gen_initial_componen ...
- AI人工智能顶级实战工程师 课程大纲
课程名称 内容 阶段一.人工智能基础 — 高等数学必知必会 1.数据分析 "a. 常数eb. 导数c. 梯度d. Taylore. gini系数f. 信息熵与组合数 ...
- Ubuntu下安装antlr-4.7.1
简介:antlr工具将语法文件转换成可以识别该语法文件所描述的语言的程序. 例如:给定一个识别json的语法,antlr工具将会根据该语法生成一个程序,该程序可以通过antlr运行库来识别输入的jso ...
- ss搭建
aliyun ecs ,hongkong , t5 , 1M, 1.卸载阿里云盾监控 wget http://update.aegis.aliyun.com/download/uninstall.sh ...
- linux中,history命令,显示时间戳?操作人?IP地址?
需求描述: 在linux环境中,有的时候为了审计的需要,要记录谁什么时间从什么IP登录,执行了什么命令,bash的history命令就能够记录这些信息,但是在默认的情况下,是不记录时间的,所以呢,在这 ...
- 【Python】博客信息爬取-微信消息自动发送
1.环境安装 python -m pip install --upgrade pip pip install bs4 pip install wxpy pip install lxml 2.博客爬取及 ...
- Docker-堆栈stack(6)
堆栈(Stack)的概念: 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起.单个堆栈能够定义和协调整个应用程序的功能,但是非常复杂的应用程序可能希望使用多个堆栈. 下面我们就开始 ...