#!/usr/bin/perl use Getopt::Std; my @sizes=('B','KB','MB','GB','TB'); $logFile=0; sub by_reverse_ip{ @sec=split(/\s+/,$b); @one=split(/\s+/,$a); if ($one[2]<$sec[2]){ return 1; } elsif($one[2]>$sec[2]){ return -1; } else{ if ($one[0]<$sec[0]){ return 1; } else{ return -1; } } } sub by_reverse_hits{ @sec=split(/\s+/,$b); @one=split(/\s+/,$a); if ($one[0]<$sec[0]){ return 1; } elsif($one[0]>$sec[0]){ return -1; } else{ if ($one[2]<$sec[2]){ return 1; } else{ return -1; } } } sub by_refs{ @sec=split(/\s+/,$b); @one=split(/\s+/,$a); if ($one[2]<$sec[2]){ return 1; } elsif($one[2]>$sec[2]){ return -1; } else{ if ($one[0] lt $sec[0]){ return 1; } else{ return -1; } } } sub by_pages{ @sec=split(/\s+/,$b); @one=split(/\s+/,$a); if ($one[2]<$sec[2]){ return 1; } elsif($one[2]>$sec[2]){ return -1; } else{ if ($one[0] lt $sec[0]){ return 1; } else{ return -1; } } } sub by_bytes{ @sec=split(/\s+/,$b); @one=split(/\s+/,$a); if ($one[3]<$sec[3]){ return 1; } elsif($one[3]>$sec[3]){ return -1; } else{ if ($one[0] lt $sec[0]){ return 1; } else{ return -1; } } } getopts('bpBarhf:'); sub refs{ my $logFile=shift; if ($logFile=~/error[\._]log$/){ die "You can't call referrer's on an error.log\n"; } else{ my $host=$logFile; $host=~s/-combined[\_\.]log//; $host=~s/-access[\_\.]log//; $host=~s/[^\/]*\///g; my %refs; @logs=`tail -500 $logFile`; foreach $i (@logs){ my @info=split(/\s+/,$i); if($info[10]){ if (($info[10]!~/http\:\/\/[^\/]*$host/)&&($info[10]!~/\"\-\"/)){ $info[10]=~s/\"//g; if ($refs{$info[6]}{$info[10]}){ $refs{$info[6]}{$info[10]}++; } else{ $refs{$info[6]}{$info[10]}=1; } } } } @temp=(); foreach my $i (keys %refs){ foreach my $j (keys %{$refs{$i}}){ push(@temp,"$i $j $refs{$i}{$j} $host"); } } } return @temp; } sub pages{ my $logFile=shift; if ($logFile=~/error[\._]log$/){ die "You can't call page's on an error.log\n"; } else{ my $host=$logFile; $host=~s/-combined[\.\_]log//; $host=~s/-access[\_\.]log//; $host=~s/[^\/]*\///g; my %hits; my %bytes; @keys=(); @logs=`tail -500 $logFile`; foreach $i (@logs){ my @info=split(/\s+/,$i); if ($hits{$info[6]}{$info[8]}){ $hits{$info[6]}{$info[8]}++; } else{ $hits{$info[6]}{$info[8]}=1; } if ($info[9]=~/^[0-9]+$/){ if ($bytes{$info[6]}{$info[8]}){ $bytes{$info[6]}{$info[8]}+=$info[9]; } else{ $bytes{$info[6]}{$info[8]}=$info[9]; } } } @keys=keys %hits; @temp=(); foreach my $i (keys %hits){ foreach my $j (keys %{$hits{$i}}){ if ($bytes{$i}{$j}){ push(@temp,"$i $j $hits{$i}{$j} $bytes{$i}{$j}"); } else{ push(@temp,"$i $j $hits{$i}{$j} 0"); } } } } return @temp; } sub gen{ my $logFile=shift; if ($logFile=~/error[\._]log$/){ my %bob; @logs=`tail -500 $logFile`; foreach $i (@logs){ if ($i=~/\[client (\d+\.\d+\.\d+\.\d+)\]/){ $bob{$1}++; } } @keys=keys %bob; @temp=(); foreach $i (@keys){ push(@temp,"$bob{$i} $i 1\n"); @$i=(); } } elsif($opt_B){ my $host=$logFile; $host=~s/-combined\.log//; $host=~s/-access_log//; $host=~s/[^\/]*\///g; my %bob; @keys=(); @logs=`tail -n 500 $logFile`; foreach $i (@logs){ my @info=split(/\s+/,$i); my $name=$info[2]; if (defined($info[8])&&($info[8] eq "401")){ $bob{$info[0]}++; } } @temp=(); foreach $i (keys %bob){ push(@temp,"$bob{$i} $i 1 $host\n"); @$i=(); } } else{ my $host=$logFile; $host=~s/-combined\.log//; $host=~s/-access_log//; $host=~s/[^\/]*\///g; my %bob; @keys=(); @logs=`tail -500 $logFile`; foreach $i (@logs){ my @info=split(/\s+/,$i); my $name=$info[2]; if (defined($info[8])&&($info[8] eq "200")){ if ($name ne "-"){ if (not(@$name)){ @$name=(); push(@$name,$info[0]); $bob{$name}=1; } else{ $info[0]=~s/\.\d+\s?$//; if (not(grep /$info[0]/, @$name)){ push(@$name,$info[0]); } $bob{$name}++; } } } } @temp=(); foreach $i (keys %bob){ my $count=scalar(@$i); push(@temp,"$bob{$i} $i $count $host\n"); @$i=(); } } return @temp; } sub nicePrint{ system("clear"); print STDOUT < /dev/null`; my @tempServers=`/bin/ls *-access[_.]log 2> /dev/null`; foreach my $i (@tempServers){ push(@allServers,$i); } chomp(@allServers); } elsif($opt_f){ $logFile=$opt_f; } else{ print "Usage: logtop [-hapra][-f LogFile]\n\n -a all log files\n -b Sort pages by bytes\n -h Sort by hits\n -p Sort by pages\n -r sort by referer\n -B Sort by 401s\n\n\n"; exit 1; } my @temp=(); if (($opt_p)||($opt_b)){ while(1){ @temp=(); if ($opt_a){ foreach my $i (@allServers){ @temp=(@temp,&pages($i)); } } else{ @temp=&pages($logFile); } if ($opt_p){ @temp=sort by_pages @temp; } else{ @temp=sort by_bytes @temp; } splice(@temp,21); system("clear"); print STDOUT <1024){ $four/=1024; $size++; } $four=int(100*$four)/100; $four.=$sizes[$size]; write; } sleep 2; } } elsif($opt_r){ while(1){ @temp=(); #print "Getting pages\n"; if ($opt_a){ foreach my $i (@allServers){ @temp=(@temp,&refs($i)); } } else{ @temp=&refs($logFile); } @temp=sort by_refs @temp; splice(@temp,21); system("clear"); print STDOUT <>>>>>>> @>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<< $one,$two,$three,$four .