加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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"; 


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读