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:20170907
#description: compress files of a specified mode and delete logs before a particular date
#version:v0.1

strategy_logs_path="/root/apps/myapp/log"
date=$(date +%Y%m%d)

#------------初始化函数默认参数----------
init_argv(){  #example:init_argv -d 4 -m cjf -r 5 打包压缩近四天及当天日志,压缩模式cjf,删除五天前日志
    compress_date=$(date +%Y%m%d)
    backup_mode="czf"
    del_days_num=3
    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 1 ;;
        esac
    done
    if [ ! -d "$backup_path" ];then
        mkdir -p $backup_path
    fi
#    if [ line -lt 1 ];then
#        echo "Not running ssh-agent"
#        exit 1
#    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/"$1".tar.gz"
    elif [ "$backup_mode" == ‘cjf‘ ];then
        ls | grep ".*[0-9]\{8\}.*\.log$"|grep ".*"$compress_date".*"|xargs tar $backup_mode "$backup_path/"$1".tar.bz2"
    else
        echo "tar mode error";exit 2
    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 0 ]];then
        for i in `seq 1 "$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 5 ];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 1 "$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 0 ];do
            argv="$argv $1"
            shift
done
main $argv

log_tar_clean.sh

四、运行脚本



日志文件初始数量为图一所示

4.1 带参数运行后

4.2  不带参数运行(默认情况,备份当天日志文件,压缩模式为“czf”,删除三天前日志文件)

为了使测试环境一致,首先恢复被删除日志文件,删除压缩文件

不带参数运行脚本

五、计划任务





基本功能已实现,但脚本还有待改进,例如脚本中使用的grep可以换成egrep,可以少一层转义。

上传备份功能还未进行测试,可能会出现错误,当然,上传前肯定得先将本地公钥放入服务器的authorized_keys文件中,实现ssh无密登陆。

最后想感慨一句,还是python更强大

good good study,day day up

时间: 2024-10-10 17:39:20

shell脚本----周期压缩备份日志文件的相关文章

【shell脚本】定时备份日志===logBackup.sh

定时备份日志 设置执行权限 [[email protected]_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [[email protected]_0_10_centos shellScript]# cat logBackup,sh #!/bin/bash#===========================================# BACKUP LOGS#================================

crontab里shell脚本将top信息写入文件

crontab里shell脚本将top信息写入文件: 注: 1.top -n 1代表执行1次退出(默认top是不退出的),-d 1代表每1秒执行1次 2.crontab里需加/bin/bash # crontab -e */5 * * * * /bin/bash /usr/local/bin/top.sh # vi top.sh #!/bin/bash Date=`date +%Y%m%d` Date2=`date +%Y%m%d_%H%M` Date3=`date +%Y%m%d -d "7

使用shell脚本简单模拟对特定文件同时读写操作

使用shell脚本简单模拟对特定文件同时读写操作文件内容的格式:field1    ,       field2    , field3    ,       field4以,为分隔符,但是存在空格. 脚本用法如下: ./check_write_read.sh 10 输出结果: Thu Apr 27 19:59:44 CST 2017:Read operation finished 670 Thu Apr 27 19:59:44 CST 2017:Write operation finished

shell脚本:脚本分析汇总ping日志文件

脚本功能:用于分析汇总大量ping日志文件 ------------------ #!/bin/bash # check ping result # by colin # on 2016-06-08 ######################################## # 功能说明:该脚本用于分析汇总某项目在线ping日志文件 # PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin LOGNAME='da

shell脚本:nginx访问日志切割与打包上传

脚本功能: 日志切割类脚本,包含:nginx的访问日志.网关设备.AC设备.认证信息等等日志,都通过ftp上传到相应的服务器进行保存. --------------- #!/bin/bash # Cut and upload nginxlog # by colin # revision on 2016-02-22 ######################################## # 功能说明:该脚本运用于切割与上传nginxlog # # 更新说明: # ############

自动压缩备份数据库文件至指定服务器

公司用的数据库服务器每天都要备份,之前都是手动压缩,再拷贝一份至另一台存储. 闲来无事就决定用个脚本可以自动备份和复制 网上有很多资料,百度一下就有了 环境介绍 数据库备份文件存放在D:\beife\下 有一台同网段的服务器作为存放压缩文件备份 2. 压缩文档 先安装Winrar软件,并确定路径,稍后需要在系统环境变量里配置 我先将存储服务器的某个网络共享文件夹映射为网盘L,然后新建txt文件,输入使用以下命令 rar a -df -agYYYY-MM-DD  L:\  D:\oracle\bf

采用shell脚本定时清理Tomcat日志

1 Shell脚本案例 删除超过30天的日志文件 #!/bin/bash log_path=/mnt/software/apache-tomcat-9.0.0.M22/logs d=`date +%Y-%m-%d` d90=`date -d'30 day ago' +%Y-%m-%d` #cd ${log_path} && cp catalina.out $log_path/cron/catalina.out.$d.log #echo > catalina.out rm -rf $l

使用shell脚本实现自动备份MySQL数据库

192.168.1.2服务器对192.168.1.1服务器上的MySQL数据库进行备份. 必须满足的条件: 1.在192.168.1.1服务器上创建专门用来备份的数据库账号,并赋予相应的权限: mysql> grant select,lock tables on *.* to 'operator'@'192.168.%.%' identified by '123456'; #备份数据库需要账号具有查看表和锁定表的权限 2.在192.168.1.2服务器上使用该账号进行手工备份,测试是否可以备份成

shell脚本:检查ftp日志存储服务器上的日志是否正常上传

脚本:check_log.sh 主要功能:用于检查日志文件是否上传到ftp服务器,若未上传的,则发邮件报警 ------------------- #!/bin/bash #Auto check log files and notice by email #By colin #Revision on 2015-11-03 # #Useage: ./check_log.sh /home/upload/  # 10 * * * * /root/check_log.sh # #############