Squid und Logstalgia
Logstalgia (auch als Apache-Pong bekannt) ist schon was nettes. Leider kann es nur mit apache-Logfiles umgehen was den
Einsatzbereich in Umgebungen in denen Squid verwendet wird schwierig macht.
Logstalgia kann nur mit ncsa-Formaten, wie sie Webserver wie Apache anliefern, umgehen. Squid hingegen hat ein eigenes, für den Einsatzzweck optimiertes Logfile-Format.
Es wäre zwar auch möglich Squid im ncsa-Format loggen zu lassen, aber dadurch verliert man wertvolle Informationen zum Caching.
Deshalb steht Squid-Logfile-Support auch auf der Wunschliste der Logstalgia-User.
Doch auch dafür gibt es jetzt eine Lösung: squid2ncsa.pl (3.04 KB)
Das Perl-Script habe ich aus dem Script squid2common.pl von Martin Gleeson
zusammengeschustert.
Es nimmt auf der Standardeingabe das Squid-Logfile entgegen, wandelt es in ncsa um und gibt es auf der Standardausgabe wieder aus. Als Zuckerl macht es auch noch DNS-Lookups für die anfragenden
Hosts.
Verwendet wird es so: tail -f /var/log/squid/access.log | ./squid2ncsa.pl
Damit steht einer Weiterleitung an Logstalgia nichts mehr im Wege.
#!/usr/bin/perl
################################################################################
#
# squid2ncsa : convert native squid log files into ncsa common
# logfile format in realtime
#
# Usage: squid2ncsa.pl
#
# Written by : Martin Seitl (martin@seitl.at)
#
# Inspired by Martin Gleesons squid2common.pl
#
# Version History
# ~~~~~~~~~~~~~~~
# Version 0.1 2012-03-29
###############################################################################
$gmtoffset = "+0100"; ###### Offset from GMT
$address_type=2;
$vhostname = "squid";
%months = ( '0','Jan', '1','Feb', '2','Mar', '3','Apr', '4','May', '5','Jun',
'6','Jul', '7','Aug', '8','Sep', '9','Oct', '10','Nov', '11','Dec');
%longmonths = ( '0','January', '1','February', '2','March', '3','April',
'4','May', '5','June', '6','July', '7','August',
'8','September', '9','October', '10','November',
'11','December');
while (<>) {
@line = split(/\s+/,$_,10);
$time = $line[0];
$elapsed = $line[1];
$host = $line[2];
$codes = $line[3];
$size = $line[4];
$htype = $line[5];
$url = $line[6];
$ident = $line[7];
$hiercodes = $line[8];
$ContentType = $line[9];
($seconds,$milliseconds) = split(/\./,$time);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
= localtime($seconds);
$year += 1900;
if($mday < 10){ $mday = "0" . "$mday";}
if($hour<10){ $hour="0" . "$hour";}
if($min < 10){ $min = "0" . "$min"; }
if($sec<10){ $sec="0" . "$sec"; }
$www_date = "$mday/$months{$mon}/$year:$hour:$min:$sec
$gmtoffset";
($squidcode,$httpcode) = split(/\//,$codes);
# convert IP into hostname
if( $hosts{$host} ) { $name = $hosts{$host};}
else
{
if($host =~ /\d+\.\d+\.\d+\.\d+/)
{
@address = split(/\./,$host);
$addpacked = pack('C4',@address);
($name,$aliases,$addrtype,$length,@addrs)
= gethostbyaddr($addpacked,$address_type);
$name
= $host if(!$name);
}
else
{
if (
$name eq "") { $name = $host; }
else {
$name = $host; }
}
$name = "\L$name";
}
print $vhostname.' '.$name.' - - ['.$www_date.'] "'.$htype.' '.$url.' HTTP/1.0" '.$httpcode.' '.$size.'"-" "-"';
print "\n";
}
Datum: 12.05.2012