面对中转机磁盘容量限制,有时为了能多保存一段时间的日志,不得不对旧日志进行压缩备份,并清理掉就日志,为此写了一段小程序分享下
场景:
某游戏一天产生的数据量
执行结果如下:
......
查看效果
........
这样执行是备份清理游戏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);
}