Schrift
[thread]8927[/thread]

apache.log auswerten mit Perl

Leser: 1


<< >> 6 Einträge, 1 Seite
Bschorf
 2007-04-18 14:53
#76020 #76020
User since
2007-04-18
12 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe angefangen ein Perl-script zu schreiben um eine apache.log auszuwerten.
Das Skript soll nur alle aufgerufenden seiten anzeigen, und dahinter Anzeigen wie oft diese Seite aufgerufen wurde.

Mit:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w


# apache logdatei analysieren
$file = "access.log";

open IN, $file;

while ( $file = <IN> ) {
# if ($file =~ /]/ ) {
$p1= index ($file,"- -");
$p2= index ($file,'"',$p1+1);
$neu = substr ($file,$p1+38,$p2);
print "$neu \n";
$n ++;
}
#}
print "\nAnzahl der Seiten: $n \n";


So zeigt er mir alle besuchten Seiten an, und wie oft alle vorkommen.
Wie kann ich das ganze nun in einem Array speichern so dass er alle vergleicht und dann für jede aufgerufene Seite einzeln Zählt und das dahinter schreibt??


PS:

Meine access.log sieht so aus:
Code: (dl )
1
2
3
66.249.72.12 - - [26/Mar/2007:06:27:01 +0200] "GET /pub/erferferfer/88736/56?date=20071111&view=d HTTP/1.1" 200 30965 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.72.12 - - [26/Mar/2007:06:29:47 +0200] "GET /pub/ferferfer/90627/56?date=20071110&view=d HTTP/1.1" 200 30962 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
127.0.0.1 - - [26/Mar/2007:06:30:01 +0200] "GET /moodle/admin/cron.php HTTP/1.0" 200 565 "-" "Wget/1.10.2"
\n\n

<!--EDIT|Bschorf|1176893735-->
renee
 2007-04-18 15:25
#76021 #76021
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Für so etwas eignet sich ein Hash:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl 

# use strict sollte Pflicht sein, verhindert viele Fehler
use strict;
use warnings;

# apache logdatei analysieren
my $file = "access.log";

# Fehler sollten abgefangen werden
# lexikalische Filehandles haben Vorteile
# 3-Arg-open ist sicherer
open my $fh,'<', $file or die $!;

my %hash;
while ( my $line = <$fh> ) {
    my ($site) = $line =~ /(?:GET|POST)\s([^\s]+)/;
    $hash{$site}++;
}
print "\nAnzahl der Seiten: ", scalar(keys %hash), " \n",
      "-"x25,"\n";

for my $url( keys %hash ){
    print $url," : ",$hash{$url},"\n";
}


(ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Bschorf
 2007-04-18 15:50
#76022 #76022
User since
2007-04-18
12 Artikel
BenutzerIn
[default_avatar]
ok, das script funktioniert 1a.
Aber hat irgendwie nicht mehr viel mit meinem zu tun ^^

was macht: das or die ?1=
Code: (dl )
open my $fh,'<', $file or die $!;


und wie funktioniert das das du hier genau die URL hast??
Code: (dl )
my ($site) = $line =~ /(?:GET|POST)\s([^\s]+)/;




Auf jedenfall vielen DANK schonmal
renee
 2007-04-18 16:06
#76023 #76023
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
open my $fh,'<', $file or die $!;


Das Skript "stirbt" (engl. die) wenn ein Fehler auftritt und gibt eine Fehlermeldung aus. Wenn die Datei nicht existiert, wird z.B.
Quote
No such file or directory at logger.pl line 13.
ausgegeben.

Das '<' gibt an, dass die Datei lesend geöffnet werden soll (siehe auch perldoc -f open).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-04-18 16:11
#76024 #76024
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
my ($site) = $line =~ /(?:GET|POST)\s([^\s]+)/;


Ich weiß nicht, ob Du Dich mit Regulären Ausdrücken auskennst?!?

Ein gutes Tutorial gibt es bei Regenechsen

Das sucht nach "GET" oder "POST" in der Zeile, dann muss ein Whitespace kommen. Dann wird alles "gespeichert" bis zum nächsten Leerzeichen.

Also so etwas (Leerzeichen mit # gekennzeichnet):

Code: (dl )
1
2
GET#http://domain.tld#
POST#https://wasanderes.example#


Der Domain-Teil wird durch die Klammerung "eingefangen". Ich speichere den eingefangenen Teil in $site.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2007-04-19 01:36
#76025 #76025
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Für solche Sachen muss man nicht unbedingt Perl verwenden, mit den guten alten Unix-Tools kann man die Sache auch erledigen und weniger coden:
Code: (dl )
perl -pe 's{.*(?:GET|POST) (\S+).*}{$1}' apache_access_log | sort | uniq -c | sort -n

Performancemäßig dürfte das aber schlechter als eine reine Perl-Lösung sein.
Und falls sich jemand wundert, dass ich hier doch perl verwende: ein Unix-Purist würde sed verwenden, aber ich habe mittlerweile vergessen, was sed-Regexps können :-)
<< >> 6 Einträge, 1 Seite



View all threads created 2007-04-18 14:53.