本程序用到几个自己写的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";