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

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


场景:

某游戏一天产生的数据量


执行结果如下:

......

查看效果

........
这样执行是备份清理游戏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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值