perl解析日志文件并插入数据库

本程序用到几个自己写的perl模块

1,解析数据库的配置文件加密解密password的模块

use MIME::Base64;

sub getOraclecfg
{	
	#声明相关变量
    my $cfgfile;	#oracle的相关信息的配置文件
    my $ip;		#oracle所在机器的IP
    my $port;		#数据库端口
    my $sid;		#oracle的实例名称
    my $username;	#连接oracle的用户名
    my $password;	#连接oracle的密码
    my $sourceIp;		#源读取oracle所在机器的IP
    my $sourcePort;		#源读取数据库端口
    my $sourceSid;		#源读取oracle的实例名称
    my $sourceUsername;		#源读取连接oracle的用户名
    my $sourcePassword;		#源读取连接oracle的密码
    my $sourceTableName;	#要查询的表名
    my $appField;		#要查询的表中的其他字段

    $cfgfile = shift(@_) ;
    open(FD,$cfgfile);
	while(<FD>)
	{
		$ip = $1 if /\[ip](.*)/;
		$port = $1 if /\[port](.*)/;
		$sid = $1 if /\[sid](.*)/;
		$username = $1 if /\[username](.*)/;
		$password = $1 if /\[password](.*)/;

		$sourceIp = $1 if /\[sourceIp](.*)/;
		$sourcePort = $1 if /\[sourcePort](.*)/;
		$sourceSid = $1 if /\[sourceSid](.*)/;
		$sourceUsername = $1 if /\[sourceUsername](.*)/;
		$sourcePassword = $1 if /\[sourcePassword](.*)/;
		$sourceTableName = $1 if /\[sourceTableName](.*)/;
		$appField = $1 if /\[appField](.*)/;

	}
   	$username =~ s/^ +//;
	$username =~ s/ +$//; 
	$password =~ s/^ +//;
	$password =~s / +$//; 
	$ip =~ s/^ +//;
	$ip =~ s/ +$//; 
	$port =~ s/^ +//;
	$port =~ s/ +$//; 
	$sid =~ s/^ +//;
	$sid =~s / +$//; 

   	$sourceIp =~ s/^ +//;
	$sourceIp =~ s/ +$//; 
	$sourcePort =~ s/^ +//;
	$sourcePort =~s / +$//; 
	$sourceSid =~ s/^ +//;
	$sourceSid =~ s/ +$//; 
	$sourceUsername =~ s/^ +//;
	$sourceUsername =~ s/ +$//; 
	$sourcePassword =~ s/^ +//;
	$sourcePassword =~s / +$//; 
	$sourceTableName =~ s/^ +//;
	$sourceTableName =~s / +$//; 
	$appField =~ s/^ +//;
	$appField =~s / +$//; 

	$password=decode_base64($password);
	$sourcePassword=decode_base64($sourcePassword);

    return { 'username' => $username,
             'password' => $password,
             'ip'   => $ip,
             'port'   => $port,
             'sid'    => $sid,
		'sourceIp' => $sourceIp,
             	'sourcePort' => $sourcePort,
             	'sourceSid'   => $sourceSid,
             	'sourceUsername'   => $sourceUsername,
             	'sourcePassword'    => $sourcePassword,
             	'sourceTableName'    => $sourceTableName,
             	'appField'    => $appField,
             'cfg'   => "$username$password$ip$port$sid$sourceIp$sourcePort$sourceSid$sourceUsername$sourcePassword$sourceTableName$appField" 
          };
}
return 1;
配置文件

[ip]16.190.252.128
[sid]bsm
[port]1521
[username]UA
[password]UA
[fileLocation]E:/workspace/finallog2db/test
[basename]abcSystem_172.12.4.23_xxLog.errlog
读取日志文件大小的perl模块

 sub getSize
{	
	#声明相关变量
    my $cfgfile;	#size.cfg文件的位置
    my $size;	#文件的字节数
    
    $cfgfile = shift(@_) ;
    open(FD,$cfgfile);
	while(<FD>)
	{
		$size = $1 if /\[size](.*)/;
	}
    $size =~ s/^ +//;
	$size =~ s/ +$//; 
	
    return { 'size' => $size,
             #'cfg'   => "$size" 
          };
}
return 1;
配置文件

[size]452

程序的主体部分

use strict;
use DBI;
use POSIX qw(strftime);
use File::Find;

use logInteface_recodeSize;
use logInteface_to_db;


#数据库相关配置文件位置
my $fileLocation = "dbInteface_to_db.cfg";

#记录上次读取位置的文件
my $sizeLocation = "size.cfg";

#获取日志文件的位置,名称等的配置文件(前面的一个部分,yyyyMMdd的文件夹由程序生成)
my $logLocation = "logInteface_to_db.cfg";

#获得oracle的配置
my $cfg = &getOraclecfg($logLocation);
my $username = $cfg->{username};
my $ip=$cfg->{ip};
my $sid=$cfg->{sid};
my $port=$cfg->{port};
my $password=$cfg->{password};

#获得日志文件目录前面固定的名称
my $baseDir = $cfg->{fileLocation};
#获得日志文件的名称如:abcSystem_172.12.4.23_xxLog
my $basename=$cfg->{basename};

#获得上次读取文件的位置
my $size = &getSize($sizeLocation)->{size};

my $total = 0;


#获取yyyymmdd这种格式的日期  
my $ymd = strftime("%Y%m%d", localtime(time()));
#获得当前日期的前一天
my $bymd = strftime("%Y%m%d", localtime(time()-3600*24));
#日志文件的完整路径
$baseDir="test/";
my $fullDir=$baseDir.$ymd."/";
print"$fullDir----fullDir";
opendir (DIR, "$fullDir" )or die "Can not open $fullDir/n";
#读取$fullDir目录中的所以文件,将文件名称放入数组@filelist中
#注意即使目录是空的,也有$fullDir..和$fullDir...这个两个元素。所以有日志文件,长度就是3
my @filelist = readdir DIR;
#按照ASCII顺序排序,abcSystem_172.12.4.23_xxLog.errlog.x中1会排在2前面,abcSystem_172.12.4.23_xxLog.errlog排在abcSystem_172.12.4.23_xxLog.errlog.1前面
my @sortlist = sort@filelist;

#print scalar(@filelist); 打印@filelist的长度
#读取日志文件总大小

if(@sortlist < 3){
	#@filelist的长度小于3,目录为空
	print "目录中没有日志文件";
}else{
	#总是读取abcSystem_172.12.4.23_xxLog.errlog,这个才是当前记录日志的文件
	find(sub { $total += -s if -f $_ }, "$fullDir/$sortlist[2]");
}
#创建连接

my $dbh=DBI->connect("dbi:Oracle:host=$ip;sid=$sid;port=$port", $username, $username) or die "Cannot conenct oracle11g: $DBI::errstr\n"; 
my $sql = qq{insert into test_errlog(id, logTime, LogLevel, appIp, funCode, flowCode, infoCode, logCause, field1) values (seq_test.nextval,to_timestamp(?,'yyyy-mm-dd hh24:mi:ss.ff3'),?,?,?,?,?,?,?)};  
  

my $sth = $dbh->prepare($sql);  

#如果本次读取的大小大于总大小,则说明以后更换文件了,则需要读取旧日志的最后一部分及新日志的全部
if ($total<$size) {
	#此处开始读取旧日志文件,并执行插入。旧日志的命名规则是:一直累加[.自然数],比如errlog.1、errlog.2,最新的是看最后小数的大小,最大的是最后一个旧日志文件
	if(@sortlist == 3){
		#当天的日志目录中只有一个日志文件,将此文件的完整路径存入$todayLogfile变量
		my $todayLogfile = "$fullDir/$sortlist[2]";
		#目录中只有abcSystem_172.12.4.23_xxLog.errlog一个日志文件,此时要切换到前一天的目录
		#日志文件的完整路径
		$fullDir=$baseDir.$bymd;
		opendir (DIR, "$fullDir" )or die "Can not open $fullDir/n";
		@filelist = readdir DIR;
		@sortlist = sort@filelist;
		#定位到上次读取文件的位置
		open(FILE,"$fullDir/$sortlist[@sortlist-1]");
		seek FILE,$size,0;
		while(<FILE>)
		{
			chomp;
			#分割日志的内容
			my @line = split (/\|\|/, $_);
			if(@line != 0){
				$line[0] =~ s/,/\./; 
				$sth->execute($line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]);  
			}
			
		}
		close(FILE);
		#开始读取今天的日志
		
		open(TODAYLOG, $todayLogfile);
		while(<TODAYLOG>)
		{
			chomp;
			#分割日志的内容
			my @line = split (/\|\|/, $_);
			if(@line != 0){
				$line[0] =~ s/,/\./; 
								print "(不同天昨天日志):{{{$line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]}}}";
				
				$sth->execute($line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]);  
			}
			
		}
		close(TODAYLOG);
	}elsif(@sortlist > 3){
		#目录中有多个日志文件
		#定位到上次读取文件的位置
		open(FILE,"$fullDir/$sortlist[@sortlist-1]");
		seek FILE,$size,0;
		
		while(<FILE>)
		{
			chomp;
			#分割日志的内容
			my @line = split (/\|\|/, $_);
			if(@line != 0){
				$line[0] =~ s/,/\./; 
								print "(不同天昨天日志):{{{$line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]}}}";
				
				$sth->execute($line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]);  
			}
			
		}
		close(FILE);
		#开始读取今天的日志
		open(CURRENTLOG, "$fullDir/$sortlist[2]");
		while(<CURRENTLOG>)
		{
			chomp;
			#分割日志的内容
			my @line = split (/\|\|/, $_);
			if(@line != 0){
				$line[0] =~ s/,/\./; 
								print "(不同天昨天日志):{{{$line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]}}}";
				
				$sth->execute($line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]);  
			}
			
		}
		close(CURRENTLOG);
	}
}else {
	#定位到上次读取文件的位置
	open(CURRENTLOG, "$fullDir/$sortlist[2]")or die "Can not open file 222 $fullDir/$sortlist[@sortlist-1]/n";
	print CURRENTLOG;
	seek CURRENTLOG,$size,0;
	
	while(<CURRENTLOG>)
	{
		chomp;
		#分割日志的内容
		my @line = split (/\|\|/, $_);
		if(@line != 0){
			$line[0] =~ s/,/\./; 
							print "(不同天昨天日志):{{{$line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]}}}";
			
			$sth->execute($line[0],$line[1],$line[2],$line[3],$line[4],$line[5],$line[6],$line[7]);  
		}
		
	}
	close(CURRENTLOG);
}


open(SIZE,">$sizeLocation");
print SIZE "[size]$total";
close(SIZE);
#断开连接
$dbh->disconnect or warn "DB disconnect failed: $DBI::errstr\n";  
print "Disconnected from Oracle databae!\n"; 






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值