#!/usr/bin/perl
#取文件行数
##循环开始清空文件
use POSIX;
use CGI;
use DBI;
my $dbName = 'oadb';
my $dbUser = 'query';
my $dbUserPass = 'query';
my $dbh = DBI->connect("dbi:Oracle:$dbName", $dbUser, $dbUserPass) or die "can't connect to database " ;
my $dir = '/usr/local/apache-tomcat-7.0.55_8081/logs';
my $file = 'catalina.out';
my $SDATE = strftime("%Y-%m-%d",localtime());
my $XDATE = strftime("%Y%m%d%H%M%S",localtime());
$mon_file = "$dir/$file";
if (-f "tmp.out"){
open FILE,">tmp.out";
close FILE;}
open( A, "<", "count.txt" );
while (<A>) {
$count = $_;
};
print "上次记录的记录数为$count
";
open(my $fh, '<', "$mon_file");
$. = 0;
while (<$fh>) {
($num=$.) if eof;
};
print "文件最新的记录数为$num"."
";
open( B, ">", "count.txt" );
print B ("$num
");
if ( defined($count) && $num != $count && $num !=0 )
{ print "开始处理
";
open( C, "<", "$mon_file" ) || die "$!
";
while (<C>) {
if ($. > "$count" ){
open( D, ">>", "tmp.out" );
print D ("$_");
}
}
};
close D;
##########监控关键字,以空格隔开################
@warn_arr = qw/ 登录失败 登陆失败 用户名或密码错误/;
foreach $a (@warn_arr)
{
$i = 0;
$num = 0;
$b = 0;
open( D, "<", "tmp.out" ) || die "$!
";
while (<D>)
{
$num++;
if ( ( $_ =~ /$a/i ) && ($_ =~ /ClientAuthRealm/i) )
{
$i++; $b = $num ;$c = $num -1;
print "$b is $b
";
print "$c is $c
";
open( E, "<", "tmp.out" ) || die "$!
";
while (<E>) {
if ( $. == "$c" ){ if ($_ =~ /.*username=(.*?)&password.*/){$USER=$1};};
if ( $. == "$b" ){ if ($_ =~/.*{("retCode.*?)}.*/){$err_mes=$1};
if ($_ =~/(.*?),.*/){$date=$1;}
}};
close E;
print "$USER is $USER
";
print "$err_mes is $err_mes
";
print "$date is $date
";
$dbh->do("INSERT INTO QUERY.ERR_INFO values('$USER','121.40.167.35',to_date('$SDATE','yyyy-mm-dd'),'$date||$err_mes',to_date('$XDATE','YYYYMMDDHH24MISS'))") or die($DBI::errstr);
};
};
close D;
};