Logging User Directories
Problem
You want each user directory Web site (i.e., those that are
accessed via http://server/~username)
to have its own logfile.
Solution
In httpd.conf, add the directive:
CustomLog "|/usr/local/apache/bin/userdir_log" combined
Then, in the file /usr/local/apache/bin/userdir_log, place the following code:
#!/usr/bin/perl
my $L = '/usr/local/apache/logs'; # Log directory
my %is_open = (); # File handle cache
$|=1;
open(F, ">>$L/access_log"); # Default error log
while (my $log = <STDIN>) {
if ($log =~ m!\s/~(.*?)/!) {
my $u = $1;
unless ($is_open{$u}) {
my $fh;
open $fh, '>>' . $L . '/'. $u;
$is_open{$u} = $fh;
}
select ($is_open{$u});
$|=1;
print $log;
}
else {
select F;
$|=1;
print F $log;
}
}
close F;
foreach my $h (keys %is_open) {
close $h;
}Discussion
Usually, requests to user directory Web sites are logged in the main server log, with no differentiation between one user’s site and another. This can make it very hard for a user to locate log messages for their personal Web site.
The recipe above allows you to break out those requests into one logfile per user, with requests not going to a userdir Web site going to the main logfile. The log handler can, of course, be modified to put all log messages in the main logfile as well as in the individual logfiles.
In order to lessen the amount of disk activity necessary, file handles are cached, rather than opened and closed with each access. This results in a larger number of file handles which are open at any given ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access