perl解析日志文件并插入数据库
发布时间:2020-12-15 20:59:28 所属栏目:大数据 来源:网络整理
导读:本程序用到几个自己写的perl模块 1,解析数据库的配置文件加密解密password的模块 ?use MIME::Base64;sub getOraclecfg{#声明相关变量 my $cfgfile;#oracle的相关信息的配置文件 my $ip;#oracle所在机器的IP my $port;#数据库端口 my $sid;#oracle的实例名称
本程序用到几个自己写的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::errstrn"; 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::errstrn"; print "Disconnected from Oracle databae!n"; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |