技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

重构前的程序:通过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

posted on 2013-12-27 17:35  codestyle  阅读(1167)  评论(0编辑  收藏  举报