Download | Plain Text | Line Numbers


#!/usr/bin/perl
 
use strict;
 
#-------------------------------------------------------------------------------
 
our $logdir = "/var/log/apache2/confixx/domains/access";
our %filecache = ();
our %logcache = ();
our $alarm = 10;
our $errorlog = ($ARGV[0] eq 'errorlog') ? 1 : 0;
$SIG{ALRM} = \&on_alarm;
 
#-------------------------------------------------------------------------------
 
sub on_alarm
{
  #print "ALARM!!!", $/;
  foreach my $logfile (keys(%logcache))
  {
    #print "writing log for ", $logfile, $/;
    if (open(LOG, ">>" . $logfile))
    {
      foreach my $logline (@{$logcache{$logfile}})
      {
        print LOG $logline;
      }
      close(LOG);
    }
    delete($logcache{$logfile});
  }
 
  alarm($alarm);
}
 
#-------------------------------------------------------------------------------
 
alarm($alarm);
while(my $line = <STDIN>)
{
  my ($domain, $log) = split(/:#?:/, $line, 2);
  $domain = lc($domain);
  #print "received log for ", $domain, $/;
 
  my $logfile;
  if (!defined($filecache{$domain}))
  {
    my $logfilelink = $logdir . "/" . $domain;
    next
      if (!-l $logfilelink);
    $logfile = readlink($logfilelink);
    $logfile =~ s/\/access_log/\/error_log/
      if ($errorlog);
    $filecache{$domain} = $logfile;
  }
  else
  {
    $logfile = $filecache{$domain};
  }
 
  #print "received log for ", $domain, " file=", $logfile, $/;
  #if (!$errorlog)
  #{
  #  $log =~ s/^(\d+\.\d+\.\d+)\.\d+ /$1.0 /;
  #}
  #else
  #{
  #  $log =~ s/\[client (\d+\.\d+\.\d+)\.\d+\]/\[client $1.0\]/;
  #}
  push(@{$logcache{$logfile}}, $domain . ' ' . $log);
}