vhost-stack/sbin/split-apache-logfile.pl

104 lines
3.4 KiB
Perl
Raw Normal View History

2022-07-19 13:18:12 -07:00
#!/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 <matthewsaundersbrown@gmail.com>
# 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";
# remove any previous files from spool dir
system("/usr/bin/find $spool_dir -type f -name '*.log' -exec rm {} +");
while (my $log_line = <STDIN>) {
#
# 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;