Hallo Siechfred!
Moin Kujau ;)
;)
Wenn es Dich interessiert, hier mein LogAnalyze.pm 0.0.1:
http://test.anaboe.net/LogAnalyze.pm
Natürlich interessiert mich das, super und vielen Dank!
Ich werde es mir aber etwas später richtig und genau anschauen, sicher erst heute abend, weil... ich bastle wieder selbst ;)
Und zwar soll statfaker.pl (ersetzt mein bisheriger statmaker.pl) ein Konsolenskript sein. Aber eins[1] nach dem andern... Zunächst musste ich mein RegExp vom Posting Logline splitter korrigieren, er sieht jetzt so aus:
($site,$rfc931,$user,$when,$request,$status,$bytes,$domain,$from,$agent,$proxy)=
m{
^ # Stringbeginn
(\S+) # $site (Bei 1&1: IP-Adresse)
\s* # Leerzeichen
(\S+) # $rfc931. Hier steht nur: -
\s* # Leerzeichen
(\S+) # $user (Bei HTTP-Auth: Username, sonst: -)
\s* # Leerzeichen
\[([^\]]+)] # $when (Datum/Zeit-Gruppe - in eckigen Klammern)
\s* # Leerzeichen
"(.+[\\"]*[^"]+HTTP/\d\.\d)" # $request (GET|POST|HEAD|PUT + angeforderte Ressource + HTTP-Protokoll - in Anführungszeichen)
\s* # Leerzeichen
(\S+) # $status (Serverresponse: Zahl)
\s* # Leerzeichen
(\S+) # $bytes (Dateigröße in Bytes: Zahl)
\s* # Leerzeichen
(\S+) # $domain (Domain/Subdomain - 1&1-spezifisch)
\s* # Leerzeichen
"\s*(.*[\\"]*[^"]*)\s*" # $from (HTTP-Referrer - in Anführungszeichen)
\s* # Leerzeichen
"\s*(.*[\\"]*[^"]*)\s*" # $agent (User-Agent - in Anführungszeichen)
\s* # Leerzeichen
"([^"]*)" # $proxy (Proxy-IP, wenn übermittelt - 1&1-spezifisch)
\s* # Leer- oder Steuerzeichen
$ # Stringende
}ox;
Ein " war unnötigerweise escaped (by $proxy), und dann mussten an zwei, drei Stellen ein * für null oder beliebig viele anstatt + für ein oder beliebig viele Zeichen. Grund ist, dass normalerweise, wenn kein Referrer übertragen wird, in den Logs "-" eingetragen wird. In manchen Fällen kommt aber rein gar nichts vor, nur "", also ein leerer String.
Ich werde in LogAnanlyze.pm sicher auch die entsprechenden RegExps anpassen müssen, oder?. Noch was: bei den RegExps für die quoted Strings musste ich:
[\"] hinzufügen, um z.B. bei solchen Requests:
http://www.atomic-eggs.com/wae/wae"anfuehrungszeichen".shtml
den komplette String zu erhalten - sonst ist hinter wae Schluß:
The following lines were ignored:
84.176.90.89 - - [13/Dec/2007:11:53:23 +0100] "GET /wae/wae"anfuehrungszeichen".shtml HTTP/1.1" 404 10254 www.atomic-eggs.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)" "-"
(hier aus access.pl mit dem original-RegExp). Dagegen access_test.pl mit dem angepassten RegExp: keine Zeile ignored:
|84.176.90.89 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)|
|Besuchte Domain |Uhrzeit |Methode|Angeforderte Datei |Status
www.atomic-eggs.com|11:53:23|GET |/wae/wae"anfuehrungszeichen".shtml|404 -
Generell zu RegExps. Runde Klammer müssen beide maskiert werden, so sie nicht als Klammerung verstanden werden wollen, bei eckigen Klammern nur die erste, so es nicht als Zeichenklasse verstanden werden will, bei geschweiften gar keine?
[1] 1&1 erstellt Tageslogs, die am nächsten Tag gezippt werden. Aus denen wird zu Beginn einer neuer Woche eine access.log.XX.gz erstellt, wobei XX die Wochenzahl ist. Diese »Wochenlogs« bleiben neun Wochen erhalten, bevor sie gelöscht werden. Aus diesen Wochenlogs erstelle ich mit folgendem Skript eine Monatslog:
use strict;
use CGI::Carp qw(fatalsToBrowser);
my $type ="text/plain";
print "Content-type: $type\n\n";
my $dcr = $ENV{'DOCUMENT_ROOT'};
my @weeks = (1..52);
chdir "$dcr/logs" or die "BLUBBDIR: $!";
foreach my $week (@weeks) {
if (-e "access.log.$week.gz") {
open (LOG, "gzip -dc <access.log.$week.gz|") or die "BLUBBFILE: $!";
while (<LOG>) { print if m!/Nov/!; }
close (LOG);
}
}
Diese Monatslogs werden mitunter bis über 70 MB groß, ein Erstellen auf dem Server ist mir aus Speicherzuweisungsgründen nicht möglich. Also lasse ich das Ergebnis im Browser ausgeben und speichere es auf meinem Rechner ab (sobald der Browser fertig ist mit Rendern... *g*). Die Auswertung durch statfaker.pl erfolgt dann auf meinem Rechner.
In statfaker.pl brauche ich nicht den ganzen oben zitierte RegExp, sondern nur seine Einzelteile in den jeweiligen Subroutinen. Das Skript soll ein Konsolenskript mit Menüführung werden:
print "Auswertung der Logdatei für den Monat $monat!\n";
my $nun = "als Nächstes ";
showmenue('');
sub showmenue {
my $jetzt = shift;
print "Was möchtest Du $jetzt", "ausgeben? (Verlassen mit 'Q'): \n";
print "1. Browserauswertung (alle Hits) \n";
print "2. Browserauswertung (besuchte Seiten)\n";
print "3. Betriebssysteme\n";
print "4. Meistbesuchte Seiten\n";
MENUE: while (<>) {
chomp;
lc;
print "Ungueltige Eingabe! Bitte nur Zahlen zwischen '1' und '5'\noder 'Q' zum Verlassen eingeben!\n" and do MENUE if !/^q$/ && !/^[1-4]$/;
exit if /q/;
browser() and last if /^1$/;
browser_html() and last if /^2$/;
os() and last if /^3$/;
mostview() and last if /^4$/;
}
}
Also habe ich noch Arbeit vor mir, und der Schnellste bin ich leider nicht. Die Browser habe ich durch, die OS auch, ich kämpfe noch mit den meistbesuchten Seiten... dann kommen die meisten Referrer
Vielleicht läßt sich Dein Modul implementieren, mit dem werde ich auf jeden Fall experimentieren. ;)
So, und jetzt weiter proggen...
Danke nochmals und
viele Grüße aus Frankfurt/Main,
Patrick, dem die explorer.exe schon zum dritten Mal abschmiert und via Task-Manager neu gestartet werden muss :(