Hi, I've just written a short perl script to perform logging for our virtual hosts. The code has plenty of comments so I'll paste it below.
My question is: would it be possible to use mod_perl in some way to perform the function of the script? In testing the speed of the script seems reasonable enough, is there a better way to do what I'm doing below? On a related note, I'd ideally like to be able to do similar for Apache Error logging - ie log apache error log entries once into a main errorlog file and once into a vhost errorlog file. Is this possible with ErrorLog lines? My initial understanding is this isn't possible using the framework outlined in the code below. Code follows: #!/usr/bin/perl # Script to pipe apache log entries to virtually hosted log files # Assumes httpd.conf has the following: # LogFormat "%v %h %l %u %t \"%r\" %>s %b" commonvhost # and that ONLY the following logging line is used in the httpd.conf: # CustomLog "| /path/to/logger.pl" commonvhost # DO NOT configure the CustomLog directive in the vhost stubs for vhosts # or this will not work. # Script logs commonvhost entries to a logfile with a template of: # /var/log/httpd/virtual.domain/$year/$month/$day use strict; my $logEntry = <>; # get the vhost from this log entry: $logEntry=~/(.*?) /; my $vhost = $1; my ($year, $month, $day) = ( (localtime)[5]+1900, sprintf("%02d", (localtime)[4]+1), sprintf("%02d", (localtime)[3]) ); # Name of access logfiles: my $accessLogName = "httpd-access.log"; =comment $logdir: Location to put all logfiles This will log everything into: $logdir/all/$year/$month/$day/httpd-access.log and put individual vhost logfiles into: $logdir/$vhost/$year/$month/$day/httpd-access.log =cut my $logDir = "/var/log/httpd"; my $allLogDir = "$logDir/all/$year/$month/$day"; my $vhostLogDir = "$logDir/$vhost/$year/$month/$day"; writeLog($allLogDir, "all"); writeLog($vhostLogDir, "vhost"); # write a log entry to a file sub writeLog(){ my $logDir = shift @_; my $type = shift @_; if( ! -d $logDir ) { `mkdir -p $logDir`; } open(FD, ">>$logDir/$accessLogName"); # if type is vhost, strip off the vhost data: if($type eq "vhost"){ $logEntry =~s/.*? //; } print FD $logEntry; close FD; } -- Jez http://www.munk.nu/