#!/usr/bin/perl # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Modified 2022 by Matthew Saunders Brown # to work with vhost-stack https://git.stack-source.com/msb/vhost-stack # # # This script will take a combined Web server access # log file and break its contents into separate files. # It assumes that the first field of each line is the # virtual host identity (put there by "%v"), and that # the logfiles should be named that+".log" in the current # directory. # # The combined log file is read from stdin. Records read # will be appended to any existing log files. # # use strict; use warnings; my %log_file = (); # read all files from /srv/www opendir(DIR, "/srv/www") or die "couldn't open /srv/www/ to get list of virtualhosts: $!\n"; my @dir = readdir DIR; closedir DIR; # create virtualhosts array from /srv/www listing my %virtualhosts = (); foreach $virtualhost (@dir) { if ($virtualhost ne "." && $virtualhost ne ".." && $virtualhost ne "html") { if (-d "/srv/www/$virtualhost") { $virtualhosts{ $virtualhost } = $virtualhost; } } } # set spool dir for temporary apache files $spool_dir="/var/spool/apache2"; # creatre spool dir if it doesn't already exist if (!-d "$spool_dir") { system("mkdir $spool_dir"); } # remove any previous files from spool dir system("/usr/bin/find $spool_dir -type f -name '*.log' -exec rm {} +"); while (my $log_line = ) { # # Get the first token from the log record; it's the # identity of the virtual host to which the record # applies. # my ($vhost) = split (/\s/, $log_line); # # Normalize the virtual host name to all lowercase. # If it's blank, the request was handled by the default # server, so supply a default name. This shouldn't # happen, but caution rocks. # $vhost = lc ($vhost) || "access"; # # Strip of leading www. # $vhost =~ s/^www\.//; # # Strip of the trailing port number # $vhost =~ s/\:.*//; # # if the vhost contains a "/" or "\", it is illegal so just use # the default log to avoid any security issues due if it is interprted # as a directory separator. if ($vhost =~ m#[/\\]#) { $vhost = "access" } # # If the log file for this virtual host isn't opened # yet, do it now. # if (exists($virtualhosts{$vhost})) { if (! $log_file{$vhost}) { open $log_file{$vhost}, ">>$spool_dir/${vhost}.log" or die ("Can't open $spool_dir/${vhost}.log"); } # # Strip off the first token (which may be null in the # case of the default server), and write the edited # record to the current log file. # $log_line =~ s/^\S*\s+//; print {$log_file{$vhost}} $log_line; } } exit 0;