perl对日志进行压缩备份小程序

来源:互联网 发布:视频添加二维码软件 编辑:程序博客网 时间:2024/05/24 07:30

面对中转机磁盘容量限制,有时为了能多保存一段时间的日志,不得不对旧日志进行压缩备份,并清理掉就日志,为此写了一段小程序分享下


场景:

某游戏一天产生的数据量


执行结果如下:

......

查看效果

........
这样执行是备份清理游戏game_name的23天前的日志
也可查看日志文件看执行情况


可以看出日志目录删除了,取而代之的是压缩后的备份文件,而且占用很少的存储,当再次使用时可以调用解压脚本解压,再进行分析。


程序源代码如下:

#!/usr/bin/perl -w############################################################################# Copyright@2014 Beijing xxxxx xxxxx xxxxxx Technology Co., Ltd.## --- 原始日志压缩备份清理 ---## [usage]# wmgame_data_pack.pl -g [游戏名] -d [日志日期] -l [备份天数]## [返回值]# 0: 正常退出# 0以外: 异常退出## [功能]# 原始日志压缩备份,旧日志清理处理。## [模块构成]# wmgame_data_pack.pl           本脚本## [输入输出文件]## /xxxxxx/xxxxxxxx/[游戏名]/*/[日期]                        (I) 日志数据文件# /xxxxxx/xxxxxxxx/[游戏名]/*/[游戏名].[ip].[日志日期].bz2  (O) 压缩后日志文件# [注意事項]# 无## [更新历史]# -------------------------------------------------------------------------# Ver.1.00  2014/04/15  ly               作成# -------------------------------------------------------------------------############################################################################use strict;use Getopt::Long;use Switch;my $logdate;my $game;my $limitday;my ${lenv_script_name} = $0;${lenv_script_name} =~ s/\..*//;${lenv_script_name} =~ s/.*\///;my ${lenv_log_trace} = "/tmp/${lenv_script_name}.log";if(@ARGV == 0){    &ShowHelp();}my $lenv_args_result = GetOptions (    "game=s" => \$game,    "date=s" => \$logdate,    "limit=s" => \$limitday,);sub ShowHelp(){    print "\nUsage:\n\t $0 -g {gamename1|gamename2} -d [date] -l [days]\n\n";    print "\n\t $0 -g {gamename1|gamename2}\n\n";    exit 1;}if(not defined $game){    &wmfunc_file_write_log("ERR","请指定游戏名称!\n");    exit 1;}if(not defined $limitday){    $limitday=30;}chomp($logdate = qx/date -d "$limitday days ago" +\%F/);my @dirs=glob("/home/web/test/$game/*/$logdate");if(@dirs == 0){    chomp(my $tmptime = qx#date +\%F' '\%T#);    &wmfunc_file_write_log("INF","$logdate号数据已经被清理 !");    exit 0;}foreach my $line (@dirs){    chomp($line);    chomp(my $tmptime = qx#date +\%F' '\%T#);    my ($ip,$tmpdate,$filename);    if($line =~ /(\d+\.\d+\.\d+\.\d+)\/(\d+)-(\d+)-(\d+)/)    {         ($ip,$tmpdate) = ($1,$2 . $3 . $4);              }    $filename = "/home/web/test/$game/$ip/$game.$ip.$tmpdate.bz2";    if(not -f $filename){        &wmfunc_file_write_log("INF","原始文件压缩备份处理");        &wmfunc_file_write_log("DBG","EXEC CMD : [ tar -jcvpf $filename $line ]");        qx#tar -jcvpf $filename $line 2>/dev/null#;        if("$?" ne "0")        {            &wmfunc_file_write_log("INF","原始文件压缩备份处理 : 失败!");            exit 1;        }        &wmfunc_file_write_log("INF","原始文件压缩备份处理 : 成功!");        chomp($tmptime = qx#date +\%F' '\%T#);        &wmfunc_file_write_log("INF","原始日志删除处理");        &wmfunc_file_write_log("DBG","EXEC CMD : [ rm -rf $line ]");        qx#rm -rf $line#;        if("$?" ne "0")        {            &wmfunc_file_write_log("INF","原始日志删除处理 : 失败!");            exit 1;        }        &wmfunc_file_write_log("INF","原始日志删除处理 : 成功!");    }else{        &wmfunc_file_write_log("INF","档案$filename已经被压缩 !");        &wmfunc_file_write_log("INF","原始日志删除处理");        &wmfunc_file_write_log("DBG","EXEC CMD : [ rm -rf $line ]");        qx#rm -rf $line#;        if("$?" ne "0")        {            &wmfunc_file_write_log("INF","原始日志删除处理 : 失败!");            exit 1;        }        &wmfunc_file_write_log("INF","原始日志删除处理 : 成功!");    }}#-----------------------------------------------------------------------------#  函数名         : wmfunc_file_write_log#  概要           : 日志记录和输出#  参数           : $1 -  日志类型(INF/WRN/ERR)#                 : $2 -  日志信息#                 : $3 -  追加参数#                 : $4 -  日志格式标志位#  必须参数       : lenv_log - 日志文件名#  返回值(return) : (0) - 正常退出#                 : (1) - 异常退出#-----------------------------------------------------------------------------sub wmfunc_file_write_log{    # 参数定义    my ${lenv_log_level} = shift;    my ${lenv_log_msg} = shift;    my ${lenv_log_msgadd} = shift;    my ${lenv_log_outputformat} = shift;    if(not defined ${lenv_log_msgadd})    {        ${lenv_log_msgadd}="";    }    # 日志格式定义    if(not defined ${lenv_log_outputformat})    {        chomp(my ${lenv_log_date} = qx#date +\%F" "\%T#);        ${lenv_log_outputformat} = "${lenv_log_date} <${lenv_log_level}> ${lenv_log_msg} ${lenv_log_msgadd}\n";    }else    {        chomp(my ${lenv_log_date} = qx#date +\%F" "\%T#);        ${lenv_log_outputformat} = "${lenv_log_date} <${lenv_log_level}> ${lenv_log_msg} ${lenv_log_msgadd}\n";    }    open(LOG,">>${lenv_log_trace}") or die "打开日志文件${lenv_log_trace}发生错误  !";    print LOG "${lenv_log_outputformat}";    # 日志类型判断    switch(${lenv_log_level})    {        case("DBG")        {            # 调试输出            print "${lenv_log_outputformat}";        }                case("INF")        {            # 标准输出            print "${lenv_log_outputformat}";        }        case("WRN")        {            # 警告输出            print "${lenv_log_outputformat}";        }        case("ERR")        {            # 标准错误输出            print "${lenv_log_outputformat}";        }        else        {            # 其他异常输出            print "${lenv_log_outputformat}";            exit 1;        }    }         close(LOG);}

                                             
0 0
原创粉丝点击