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

perl解析日志文件并插入数据库,第1张

概述本程序用到几个自己写的perl模块 1,解析数据库的配置文件加密解密password的模块 use MIME::Base64;sub getOraclecfg{ #声明相关变量 my $cfgfile; #oracle的相关信息的配置文件 my $ip; #oracle所在机器的IP my $port; #数据库端口 my $sid; #oracl

本程序用到几个自己写的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 =  if /\[ip](.*)/;		$port =  if /\[port](.*)/;		$sID =  if /\[sID](.*)/;		$username =  if /\[username](.*)/;		$password =  if /\[password](.*)/;		$sourceIp =  if /\[sourceIp](.*)/;		$sourcePort =  if /\[sourcePort](.*)/;		$sourceSID =  if /\[sourceSID](.*)/;		$sourceUsername =  if /\[sourceUsername](.*)/;		$sourcePassword =  if /\[sourcePassword](.*)/;		$sourcetablename =  if /\[sourcetablename](.*)/;		$appFIEld =  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 =  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_xxLogmy $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...这个两个元素。所以有日志文件,长度就是3my @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 (/\|\|/,/\./; 								print "(不同天昨天日志):{{{$line[0],$line[7]}}}";								$sth->execute($line[0],$line[7]);  			}					}		close(TODAYLOG);	}elsif(@sortList > 3){		#目录中有多个日志文件		#定位到上次读取文件的位置		open(file,0;				while(<file>)		{			chomp;			#分割日志的内容			my @line = split (/\|\|/,$line[7]);  			}					}		close(file);		#开始读取今天的日志		open(CURRENTLOG,"$fullDir/$sortList[2]");		while(<CURRENTLOG>)		{			chomp;			#分割日志的内容			my @line = split (/\|\|/,$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,0;		while(<CURRENTLOG>)	{		chomp;		#分割日志的内容		my @line = split (/\|\|/,$_);		if(@line != 0){			$line[0] =~ s/,/\./; 							print "(不同天昨天日志):{{{$line[0],$line[7]}}}";						$sth->execute($line[0],$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"; 
总结

以上是内存溢出为你收集整理的perl解析日志文件并插入数据库全部内容,希望文章能够帮你解决perl解析日志文件并插入数据库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1292117.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存