本程序用到几个自己写的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解析日志文件并插入数据库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)