zoukankan      html  css  js  c++  java
  • 重构前的程序:通过rsync命令抓取日志文件

    基本概况:

    我有一台服务器每天每个小时都会生成一个日志文件,这些日志文件会被保留2天,超过2天会被一个程序压缩放到备份目录,日志文件的文件名是有命名要求的,例如:project_log.20130101.01, project_log.20130101.02 意思即:2013年1月1日1点和2点生成的日志文件,他们被备份后的文件名是:project_log.20130101.01.gz, project_log.20130101.02.gz

    另外有一台服务器可从这台服务器上抓取文件,它即可以抓取昨天生成的尚未备份的日志,也可以抓取比较早的已经被备份的数据,还可以抓取当天已经生成了的日志文件

    #!/bin/sh
    
    echo "$0 start at `date +"%F %k:%M:%S"`" 1>&2
    
    export RSYNC_PASSWORD="abcabc"
    
    if [ $# -eq 0 ] 
    then
            # 没有参数 统计日期取一天之前的日期
            log_date=`date -d"1 day ago" +'%Y%m%d'`
    else
            # 有参数 统计日期取参数指定日期
            log_date=`date -d"$1" +'%Y%m%d'`
    fi
    
    dir=`dirname $0`
    
    # 在当前目录下的logs/project/创建目录名是统计日期的目录
    mkdir -p $dir/logs/project/$log_date
    log_path="$dir/logs/project/$log_date"
    
    err="$dir/tmp/rsync_log_err"
    
    # 获得程序运行时的服务器日期
    now_date=`date  +'%Y%m%d'`
    
    if [ $log_date -lt $now_date ]
    then
            # 统计日期小于现在的日期 即不输入参数走的路径
            for i in `seq -w 00 23`
            do
                    echo $i 1>&2
                    :>$err
                    rsync -Cavz log@172.18.11.200::logs/syslog/project_log.$log_date.$i $log_path/project_log.$log_date.$i 2>$err
    
                    fname="$log_path/project_log.$log_date.$i"
    
                    if [ -s $err ] && [ ! -s  $fname ];then # 尝试抓取备份文件1
                            rsync -Cavz log@172.18.11.200::disk1/project_log.$log_date.$i.gz $log_path/project_log.$log_date.$i.gz 2>$err
    
                            cat $err
                            if [ -s $err ];then
                                    echo "The file $fname.gz of server is not found"
                            fi
                    fi
            done
    else
            # 统计日期 大于等于现在的日期 即通过命令行输入了日期,但是大于等于程序运行时的服务器日期
            
            now_hour=`date -d "1 hour ago" +"%Y%m%d.%H"` # 取得当前日期之前一个小时时间
    
            echo $i 1>&2 #实在不理解
    
            :>$err #据说是清空文件
    
            echo $now_hour #你这是闹那样,因为定义后没有被使用啊
    
            # 抓取命令 ,注意$i没有定义,so:这是个bug啊
            rsync -Cavz log@172.18.11.200::logs/syslog/project_log.$log_date.$i $log_path/project_log.$log_date.$i >$err
    
            fname="$log_path/project_log.$log_date.$i"
    
            if [ -s $err ] && [ ! -s  $fname ];then # 尝试抓取备份文件2
                    rsync -Cavz log@172.18.11.200::disk1/history/project_log.$log_date.$i.gz $log_path/project_log.$log_date.$i.gz >$err
    
                    if [ -s $err ];then
                                    echo "The file $fname.gz of server is not found"
                    fi
            fi
    fi
    
    echo "$0 end at `date +"%F %k:%M:%S"`" 1>&2

    我觉得这里的主要问题在于有明显的两段代码重复了,并且程序里还有一些BUG

  • 相关阅读:
    Java 数组的浅拷贝和深拷贝
    Java 传递可变参数和方法重载
    Java 数组排序
    Java 一维数组作为参数和返回值
    Java 运算符及优先级
    MySQL 由 5.7 升级为 8.0 之后,Laravel 的配置改动
    Lavarel
    Laravel框架中Blade模板的用法
    php-fpm 配置文件检测
    Laravel Blade 模板 @section/endsection 与 @section/show, @yield 的区别
  • 原文地址:https://www.cnblogs.com/code-style/p/3494568.html
Copyright © 2011-2022 走看看