Patrick Andrieu: Bekloppte User Agents zuordnen (RegExp)

0 79

Bekloppte User Agents zuordnen (RegExp)

Patrick Andrieu
  • programmiertechnik
  1. 0
    Cheatah
    1. 2

      UA-Statistiken fälschen

      Siechfred
      • perl
      1. 0
        Patrick Andrieu
        1. 1
          Siechfred
          1. 0

            Die erfolgreiche Fälschung

            Patrick Andrieu
            1. 1

              Das Modul zur erfolgreichen Fälschung?

              Siechfred
              1. 0
                Patrick Andrieu
                1. 0
                  Siechfred
              2. 0
                Siechfred
              3. 0
                Patrick Andrieu
                1. 0
                  Siechfred
                  1. 0
                    Patrick Andrieu
                    1. 0
                      Siechfred
                      1. 0
                        Patrick Andrieu
                        1. 0
                          Siechfred
                          1. 0
                            Patrick Andrieu
                            1. 0
                              Siechfred
                              1. 0
                                Patrick Andrieu
                                1. 0
                                  Patrick Andrieu
                                  1. 0
                                    Siechfred
                                    1. 0
                                      Patrick Andrieu
                                      1. 0
                                        Siechfred
                                        1. 0
                                          Patrick Andrieu
                                          1. 0
                                            Patrick Andrieu
                                          2. 0
                                            Siechfred
                                2. 0
                                  Siechfred
            2. 0

              Die erfolgreichen Statmaker- und -fälscher-Skripts für 1&1-User!

              Patrick Andrieu
              1. 0
                Patrick Andrieu
                1. 0
                  Struppi
                  1. 0
                    Patrick Andrieu
    2. 0
      Patrick Andrieu
      1. 0
        Cheatah
        1. 0
          Patrick Andrieu
  2. 0
    Don P
    1. 0
      Don P
    2. 0
      Patrick Andrieu
      1. 0
        Don P
        1. 0
          Patrick Andrieu
          1. 0
            Don P
            1. 0
              Patrick Andrieu
      2. 0

        Logline splitter (RegExp)

        Patrick Andrieu
  3. 2
    Struppi
    1. 0
      Patrick Andrieu
      1. 0
        Patrick Andrieu
  4. 0
    Der Martin
    1. 0
      Alexander (HH)
    2. 0
      Patrick Andrieu
      1. 0
        Der Martin
        1. 0
          Cheatah
          1. 0
            Patrick Andrieu
            1. 0
              Cheatah
        2. 0
          Patrick Andrieu
          1. 0
            Der Martin
            1. 0

              RegExp'sch ist gar nicht so schwer :)

              Siechfred
              • menschelei
    3. 0
      Patrick Andrieu
      1. 0
        Der Martin
        1. 0
          Patrick Andrieu
          1. 0
            Patrick Andrieu
            1. 0
              Struppi
      2. 0
        Ingo Turski
        1. 0
          Patrick Andrieu
          1. 0
            Ingo Turski
            1. 0
              Patrick Andrieu
              1. 0
                Ingo Turski
                1. 0
                  Patrick Andrieu
                  1. 0
                    Engin
                  2. 0
                    Engin
                    1. 0
                      Patrick Andrieu
                      1. 0
                        Engin
                        1. 0
                          Patrick Andrieu
                          1. 0
                            Engin
                            1. 0
                              Patrick Andrieu
                              1. 0
                                Engin
                                1. 0
                                  Patrick Andrieu
                                  1. 0
                                    Engin
                  3. 0
                    Ingo Turski
                    1. 0
                      Patrick Andrieu
        2. 0
          Patrick Andrieu

Hallo alle!

Das ist die Auswertung meiner Okober-Logfile:

Anzahl aller Hits: 309514
Internet Explorer gesamt: 148742 (48.06% aller Hits)
IE 3: 30 (0.01% aller Hits)
IE 4: 5160 (1.67% aller Hits)
IE 5: 8095 (2.62% aller Hits)
IE 6: 93525 (30.22% aller Hits)
IE 7: 43595 (14.08% aller Hits)
Geckos: 93937 (30.35% aller Hits)
Opera: 7694 (2.49% aller Hits)
Googlebot: 3813 (1.23% aller Hits)
Yahoo! Slurp: 9552 (3.09% aller Hits)

Mich interessieren im Moment nur die verschiedenen Versionen des Internet Explorers. Wer hier zum Taschenrechner greift, und alle Einzel-IEs zusammen addiert, kommt auf 150405, also einige mehr als die unter »Internet Explorer gesamt« herausgekommende Zahl von 148742.

Grund sind folgende UA-Strings (nach den besuchten Seiten zu urteilen, handelt es sich um Spammer):

Typ 1: Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1)
Typ 2: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 7.0; Win32; 1&1); .NET CLR 2.0.50727; IEMB3; IEMB3)
Typ 3: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 1.1.4322)
Typ 4: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; http://bsalsa.com)
Typ 5: User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)

Ja, manchmal steht sogar tatsächlich »User-Agent« im User-Agent-String drin ;) Typ 2,3,4,5 sind ziemlich ähnlich, manchmal kommt MSIE 6 zuerst und MSIE 7 weiter hinten, manchmal umgekehrt, manchmal zwei Mal die selbe Versionsnummer, etc...

Ich möchte nun diese beknackten UAs immer der im UA-String zuerst vorkommenden Browserversion zuordnen, beim oben genannten Typ 1 soll ein MSIE 6 gezählt werden, bei Typ 3 ein MSIE 7.

Bei der bisherigen, noch falschen Auswertung, sehen die entsprechenden Zeilen wie folg aus:

$allIE++ if (/compatible; MSIE / && !/Opera/);
            $anzahlIE3++ if (/compatible; MSIE 3/ && !/Opera/);
            $anzahlIE4++ if (/compatible; MSIE 4/ && !/Opera/);
            $anzahlIE5++ if (/compatible; MSIE 5/ && !/Opera/);
            $anzahlIE6++ if (/compatible; MSIE 6/ && !/Opera/);
            $anzahlIE7++ if (/compatible; MSIE 7/ && !/Opera/);

Die anzahl aller IE ($allIE) müsste richtig sein, und entspricht sicher die Anzahl aller Zeilen der Datei, in welchen »compatible; MSIE « in exakt dieser Schreibweise (kein ignore case) vorkommt. Da kein g-Flag notiert ist, wird der RegExp wohl beim ersten Vorkommen dieser Zeichenkette zufrieden sein. Hier wird also nichts doppelt gezählt.

Bei den Einzelnversionen dagegen, wird (lassen wir IE 3, 4, und 5 erstmal unbeachtet), einmal $anzahlIE6 jedesmal inkrementiert, sobald »compatible; MSIE 6« gefunden wird, und $anzahlIE7 auch jedesmal, sobald »compatible; MSIE 7« vorkommt. Ergibt bei einem UA wie Typ 3 eine Doppelt-Zählung, die ich nun vermeiden will...

Mit negativen Lookaheads gehen mir anscheinend einige Zeilen verloren:

$allIE++ if (/compatible; MSIE / && !/Opera/);
            $anzahlIE3++ if (/compatible; MSIE 3/ && !/Opera/);
            $anzahlIE4++ if (/compatible; MSIE 4/ && !/Opera/);
            $anzahlIE5++ if (/compatible; MSIE 5/ && !/Opera/);
            $anzahlIE6++ if (/compatible; MSIE 6(?!.+MSIE)/ && !/Opera/);
            $anzahlIE7++ if (/compatible; MSIE 7(?!.+MSIE)/ && !/Opera/);

Dies ergibt:

Anzahl aller Hits: 309514
Internet Explorer gesamt: 148742 (48.06% aller Hits)
IE 3: 30 (0.01% aller Hits)
IE 4: 5160 (1.67% aller Hits)
IE 5: 7194 (2.32% aller Hits)
IE 6: 92617 (29.92% aller Hits)
IE 7: 42119 (13.61% aller Hits)

Alle IEs: 148021 (Fehlen: 148742 - 148021 = 721).

Lasse ich mir die »Doubletten« ausgeben:

$doubletten++ if(/compatible; MSIE.+compatible; MSIE/);

erhalte ich 2491.

Dass mehr Doubletten existieren, als die Differenz von 721 scheint logisch, da wie bei Typ 2 zu sehen, es einige UA-Strings gibt, in denen zwei Mal die selbe IE-Version vorkommt.

Ich habe dennoch keine Idee mehr, wie ich vorgehen soll. Wer bringt mir den entsprechenden Denkschubs, wie ich meine Auswertung wieder »gerade fälsche«? :)

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
Nichts ist unmöglich? Doch!
Heute schon gegökt?
  1. Hi,

    $allIE++ if (/compatible; MSIE / && !/Opera/);

    das ist Perl, nehme ich an.

    $anzahlIE3++ if (/compatible; MSIE 3/ && !/Opera/);

    Dann wäre etwas wie

    $anzahlIE3++ && next if (/compatible; MSIE 3/ && !/Opera/);

    adäquat. Man verzeihe mir, sollte das falsch sein; meine Perl-Zeiten sind etwas lang her.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. $allIE++ if (/compatible; MSIE / && !/Opera/);
      das ist Perl, nehme ich an.

      Nein, Patrick programmiert HTML *duck & wegrenn*

      $anzahlIE3++ if (/compatible; MSIE 3/ && !/Opera/);
      Dann wäre etwas wie
      $anzahlIE3++ && next if (/compatible; MSIE 3/ && !/Opera/);

      Guter Ansatz. Ich würde es so machen:

      my %IE;  
        
      while (<DATA>) {  
        next unless (/compatible; MSIE / && !/Opera/);  
        $IE{all}++;  
        $_ =~ /compatible; MSIE (\d)(?!.+MSIE)/;  
        $IE{$1}++ if $1;  
      }  
        
      print Dumper \%IE;
      

      Siechfred

      --
      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      1. Hallo Siechfred!

        das ist Perl, nehme ich an.
        Nein, Patrick programmiert HTML *duck & wegrenn*

        Musst Du alles verraten. Außerdem hast Du vergessen, dass ich auch CSS programmiere.

        Interessanter Ansatz, löst aber das Problem der Einzel-IEs, deren Summe mit der Gesamtsumme nicht übereinstimmt, nicht:

          
        use strict;  
        use Data::Dumper;  
          
                chdir "desktop" or die $!;  
          
                        open (FILE, "Oktober_2007.txt") or die "FILEFILE: $!";  
                my %IE;  
          
        while (<FILE>) {  
          next unless (/compatible; MSIE / && !/Opera/);  
          $IE{all}++;  
          $_ =~ /compatible; MSIE (\d)(?!.+MSIE)/;  
          $IE{$1}++ if $1;  
        }  
        close FILE;  
        print Dumper \%IE;  
        
        

        ^Z

          
        $VAR1 = {  
                  '6' => 92617,  
                  '4' => 5160,  
                  '3' => 30,  
                  '7' => 42119,  
                  '2' => 27,  
                  'all' => 148742,  
                  '5' => 8085  
                };  
        
        

        Summe: 148038... Dafür findest Du 27 IE 2, die ich gar nicht in Betracht gezogen hatte ;)

        Bei fast 150000 Logs fällt es mir schwer zu finden, welche denn bei den Einzeln-Zählungen nicht berücksichtigt werden...

        Ich mach aber nachher oder morgen weiter, kann nicht in Ruhe »arbeiten«, muss mich immer wieder um Patenkindchen kümmern... was aber auch viel Spaß macht ;)

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        1. Interessanter Ansatz, löst aber das Problem der Einzel-IEs, deren Summe mit der Gesamtsumme nicht übereinstimmt, nicht:

          Dann zähle die Fakes doch mit:

          my %IE;  
            
          while (<FILE>) {  
            # Nicht-IEs uebergehen  
            next unless (/compatible; MSIE / && !/Opera/);  
            # alle IEs zählen  
            $IE{all}++;  
            # RegExp anwenden und auswerten  
            (/compatible; MSIE (\d)(?!.+MSIE)/) ? $IE{$1}++ : $IE{fake}++;  
          }  
            
          print Dumper \%IE;
          

          Müsste man evtl. noch verfeinern, aber das Prinzip ist sicher klar.

          Siechfred

          --
          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
          1. Hallo Siechfred!

            Dann zähle die Fakes doch mit:
              (/compatible; MSIE (\d)(?!.+MSIE)/) ? $IE{$1}++ : $IE{fake}++;
            }

            Super, danke! Das hat mir geholfen, die Zeilen zu finden, die unterschlagen wurden. Zusätzlich zu den UAs von »meinem Typ 1«:

            "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1)"

            gab es noch 25 solcher:

            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MSIECrawler)"
            "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)"

            Ein bisschen am RegExp geschraubt und Tadaa:

              
            use strict;  
            use Data::Dumper;  
              
            chdir "desktop" or die $!;  
            open (FILE, "IEall.txt") or die "FILEFILE: $!";  
            my %IE;  
            while (<FILE>) {  
              # Nicht-IEs uebergehen  
              next unless (/compatible; MSIE / && !/Opera/);  
              # alle IEs zählen  
              $IE{all}++;  
              # RegExp anwenden und auswerten  
              (/compatible; MSIE (\d)((?!.+MSIE\s)|(?!.+MSIECrawler))/) ? $IE{$1}++ : $IE{fake}++;  
            }  
            close FILE;  
            print Dumper \%IE;  
            ^Z  
            $VAR1 = {  
                      '6' => 92096,  
                      '4' => 5160,  
                      '3' => 30,  
                      '7' => 43580,  
                      '2' => 27,  
                      'all' => 148742,  
                      '5' => 7849  
                    };  
            
            

            Summe stimmt, Fälschung erfolgreich, habe fertig... zumindest bis die nächsten chaotischen UAs auftauchen ;)

            Viele Grüße aus Frankfurt/Main,
            Kujau

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Moin Kujau ;)

              Wenn es Dich interessiert, hier mein LogAnalyze.pm 0.0.1:

              http://test.anaboe.net/LogAnalyze.pm

              Einsatz vorläufig:

              use LogAnalyze;  
              use Data::Dumper;  
                
              my $log = LogAnalyze->new('local/path/logfiles') or die 'No object';  
              $log->getLogFile( { 'ftp'     => 'ftp.example.org',  
                                  'user'    => 'example',  
                                  'pass'    => 'anonym',  
                                  'ftp_dir' => 'logs',  
                                  'logfile' => 'access_log'  
                                }) or die $LogAnalyze::ErrorMsg;  
              my $hashref = $log->parseLogFile;  
              print Dumper $hashref;
              

              ToDo-Liste:

              • RegExp für verschiedene Logfile-Arten (z.B. IIS)
              • Statistiken (LogAnalyze::Stats)
              • Ausgaben (LogAnalyze::Output)
              • Tie::Hash implementieren

              Kannst das Modul ja mal über Deine Logfiles laufen lassen, ob es da funktioniert. Ansonsten sind Hinweise, Fehlermeldungen aber auch Lob gern willkommen :)

              Siechfred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
              1. 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:

                  
                #!/usr/bin/perl -w  
                  
                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$/;  
                           # und vielleicht mehr Subs  
                 }  
                }
                

                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 :(

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Ich werde es mir aber etwas später richtig und genau anschauen [...]

                  Dito. Aber zum Thema RegExp schau Dir mal die im ersten Rating zu Apache::ParseLog verlinkten Seiten an.

                  Siechfred

                  --
                  Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
              2. http://test.anaboe.net/LogAnalyze.pm

                Die erste Statistik ist eingebaut, eine TopXX-Liste.

                Funktionsweise:

                $log->parseLogFile or die $LogAnalyze::ErrorMsg;  
                my $stat = $log->statTop( { level => 50, field => 'url' } );  
                foreach(@$stat) {  
                  print $_->{url}, ': ', $_->{count}, "\n";  
                }
                

                Die Option level gibt die Anzahl an, in meinem Fall Top 50, die Option field das auszuwertende Feld. Möglich sind:

                ip: Die IP des Zugriffs
                date: Datum des Zugriffs
                meth: HTTP-Methode
                url: Aufgerufene URL
                proto: Protokoll
                code: HTTP-Statuscode
                length: Größe
                host: Angefragter Host
                ref: Referrer
                uas: UserAgent

                Zurückgegeben wird eine Arrayreferenz (wegen der Sortierung), deren Elemente Hashreferenzen mit jeweils zwei Schlüsseln sind: Dem angefragten Feld und "count" als Anzahl. Viel Spaß beim Testen :)

                Siechfred

                --
                Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
              3. Hallo Siechfred!

                Solele, ich hatte mal ein bisschen Zeit... Das Modul ist eine feine Sache, ich versuche, es zu verstehen. Na gut, dann fangen wir mal mit den Fragen an, die ich nach und nach - solange der Thread am Leben bleibt - sicher stellen werde.

                Zum Beispiel das hier verstehe ich nicht:

                my $class = shift;
                  my $pwd = shift;
                  mkdir $pwd unless -d $pwd;
                  my $ref = { pwd  => $pwd || cwd(),

                letztens bin ich von Dir dran erinnert worden, dass das erste Element von @_ der Klassennamen ist, soweit so gut. Demnach ist das zweite Element, wenn der Aufruf so erfolgt:

                my $log = LogAnalyze->new('local/path/logfiles') or die 'No object';

                "local/path/logfiles". Dann habe ich erwartet, dass durch mkdir ... ein Verzeichnis erstellt wird, aber halt, wird das dann hier (my $ref = { pwd  => $pwd || cwd(),) wieder aufs aktuelle Verzeichnis »umgebogen«?

                Wenn man das Modul (heute) augerufen hat, wird eine Datei log_2007-12-17.txt erstellt. Wenn ich das Modul ein zweites Mal aufrufe, wird diese nicht aktualisiert? Gut, andererseits hatte es den Vorteil, dass ich das Modul auf meine 293478 Zeilen lange Novemberdatei habe drüberlaufen lassen. Ich habe sie eben umbenannt und sie wurde nicht überschrieben!

                Dito. Aber zum Thema RegExp schau Dir mal die im ersten Rating zu Apache::ParseLog verlinkten Seiten an.

                Die hier erläuterten RegExps unterscheiden sich wenig von denen, die ich einsetze, berücksichtigen allerdings auch nicht diese sonderbaren Requests mit Anführungszeichen, die in den Logs maskiert werden, zum Beispiel:

                "GET /\"idxfloat.htm?hinweise.html#a6\"
                "GET /\"#quer\" HTTP/1.1" 404 2284 old.a
                "GET /\"javascript:alert\("\r HTTP/1.1"
                "GET /\"index.html\" HTTP/1.1" 404 2289
                "GET /\"http://old.atomic-eggs.com/\" HT
                "GET /\"#x3\" HTTP/1.1" 404 2282 old.ato

                und die ich mit [^\"] abfange.

                Ansonsten sind Hinweise, Fehlermeldungen aber auch Lob gern willkommen :)

                Lasse ich mir beispielsweise die Hosts durch:

                $log->parseLogFile or die $LogAnalyze::ErrorMsg;
                my $stat = $log->statTop( { level => 20, field => 'host' } );
                foreach(@$stat) {
                  print $_->{host}, ': ', $_->{count}, "\n";
                }
                print $/;
                my $endtime = time();
                print $endtime - $starttime, " Sekunden";

                ausgeben (OK, ich habe ja keine 20 Domains/Subdomains, aber mit der Schreibweise mit und ohne www komme ich auf 15 Einträge), sieht man, dass ein Host "" mehrmals 201 Mal gefunden wurde... eigentlich sollten die letzen Zeile ab etwa der 15. nur noch aus : bestehen..., oder was bedeutet 201?

                old.atomic-eggs.com: 100220
                selfspezial.atomic-eggs.com: 50302
                advent-2000.atomic-eggs.com: 13455
                atomic-eggs.com: 3595
                www.selfspezial.atomic-eggs.com: 3318
                www.pacworks.de: 1093
                www.old.atomic-eggs.com: 383
                goek.atomic-eggs.com: 317
                www.advent-2000.de: 223
                : 201
                www.atomic-eggs.de: 202
                www.atomic-eggs.com.: 54
                advent-2000.de: 26
                atomic-eggs.de: 12
                www.pacworks.de:80: 3
                www.advent-2000.atomic-eggs.com: 1
                : 201
                : 201
                : 201
                : 201

                Bei den Statuscodes auch:

                301: 20667
                304: 19319
                403: 6232
                404: 5972
                410: 907
                206: 524
                : 201
                300: 92
                405: 47
                302: 38
                400: 8
                401: 4
                416: 1
                : 201
                : 201
                : 201
                : 201
                : 201
                : 201
                : 201

                Ach ja... die Zeit: etwa 50 Sekunden für die fast 300000 Zeilen. Was dauert, ist nicht das durchlesen als vielmehr das Sortieren danach, denn

                $VAR1 = 1;

                wird ja ziemlich schnell ausgegeben!

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Zum Beispiel das hier verstehe ich nicht:

                  my $class = shift;

                  1. („unsichtbarer“) Parameter ist der Klassenname.

                  my $pwd = shift;

                  2. Parameter ist das Arbeitsverzeichnis für das Modul, also da, wo die Logfiles lokal liegen (sollen).

                  mkdir $pwd unless -d $pwd;

                  Das Verzeichnis wird angelegt, wenn es noch nicht existiert.

                  Dann habe ich erwartet, dass durch mkdir ... ein Verzeichnis erstellt wird, aber halt, wird das dann hier (my $ref = { pwd  => $pwd || cwd(),) wieder aufs aktuelle Verzeichnis »umgebogen«?

                  Nein, cwd() liefert ja nur das aktuelle Arbeitsverzeichnis, gesetzt wird es dadurch nicht. Letztlich soll das ja nur eine Rückfallklausel sein, wenn kein Arbeitsverzeichnis übergeben wird, man könnte das Script auch sterben lassen.

                  Wenn man das Modul (heute) augerufen hat, wird eine Datei log_2007-12-17.txt erstellt. Wenn ich das Modul ein zweites Mal aufrufe, wird diese nicht aktualisiert?

                  Nein, es wird datumsbezogen gespeichert (finde ich übersichtlicher).

                  Lasse ich mir beispielsweise die Hosts [...] ausgeben (OK, ich habe ja keine 20 Domains/Subdomains, aber mit der Schreibweise mit und ohne www komme ich auf 15 Einträge), sieht man, dass ein Host "" mehrmals 201 Mal gefunden wurde... eigentlich sollten die letzen Zeile ab etwa der 15. nur noch aus : bestehen..., oder was bedeutet 201?

                  Ist ein Bug, ich suche noch.

                  Ach ja... die Zeit: etwa 50 Sekunden für die fast 300000 Zeilen. Was dauert, ist nicht das durchlesen als vielmehr das Sortieren danach

                  Ja, RegExps sind teuer :)

                  Siechfred

                  --
                  Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                  1. Hallo Siechfred!

                    mkdir $pwd unless -d $pwd;
                    Das Verzeichnis wird angelegt, wenn es noch nicht existiert.

                    Das hatte ich auch so verstanden, es wird jedoch kein Verzeichnis angelegt, sondern die Datei wird direkt im Verzeichnis erstellt, von dem aus ich Perl aufrufe, also C:\Dokumente und Einstellungen\User

                    Nein, es wird datumsbezogen gespeichert (finde ich übersichtlicher).

                    OK.

                    oder was bedeutet 201?
                    Ist ein Bug, ich suche noch.

                    Gut.

                    Ja, RegExps sind teuer :)

                    Ist mir beim statfaker auch aufgefallen (10 Sek. für alle Hits, über 25 für die Ausgabe nach PageViews) ;)

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?
                    1. Das hatte ich auch so verstanden, es wird jedoch kein Verzeichnis angelegt, sondern die Datei wird direkt im Verzeichnis erstellt, von dem aus ich Perl aufrufe, also C:\Dokumente und Einstellungen\User

                      Welchen Pfad gibst Du an?

                      Nein, es wird datumsbezogen gespeichert (finde ich übersichtlicher).

                      oder was bedeutet 201?
                      Ist ein Bug, ich suche noch.

                      Gefunden, es sollte jetzt gehen.

                      Siechfred

                      --
                      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                      1. Hallo Siechfred!

                        Welchen Pfad gibst Du an?

                        Da ich etwas faul bin, liegt LogAnalyze.pl erstma auf dem Desktop. Aufrufen tu ich es auf der Konsole mit Desktop::LogAnalyze (copy&paste eines vorbereiteten Skripts mit meinem Username/Passwort.

                        Die Logdatei wird erstellt unter:
                        C:\Dokumente und Einstellungen\meinUser\log_2007-12-17.txt

                        oder was bedeutet 201?
                        Ist ein Bug, ich suche noch.
                        Gefunden, es sollte jetzt gehen.

                        Hm werden irgendwelche Zeilen ignoriert? Ein Vergleich:

                        LogAnalyze:
                        www.atomic-eggs.com: 92078
                        old.atomic-eggs.com: 66290

                        Patrick:
                        domains www.atomic-eggs.com: 120201
                        domains old.atomic-eggs.com: 100272

                        Summer aller (hier nicht ausgeführt) MUSS die Zeilenzahl der Datei sein, denn dieses Feld wird von 1&1 immer beschrieben (also nicht wie beim Referrer, wo es durchaus vorkommt, dass gar nichts steht - also nur "")

                        Summe LogAnalyze:
                        220558 *

                        Summe Patrick:
                        293478

                        * Diese Summe erhalte ich auch, wenn ich mir alle Dateigrößen ausgeben lasse und die Vorkommen addiere...

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        1. Hm werden irgendwelche Zeilen ignoriert?

                          Ja, es hatte sich ein Fehler im RegExp eingeschlichen.

                          Siechfred

                          --
                          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                          1. Hallo Siechfred!

                            Hm werden irgendwelche Zeilen ignoriert?
                            Ja, es hatte sich ein Fehler im RegExp eingeschlichen.

                            Hm, ich trau mich kaum noch was zu sagen, aber:

                            200: 478932
                            301: 41334
                            304: 38638
                            403: 12464
                            404: 11944
                            410: 1814
                            206: 1048
                            300: 184
                            405: 94
                            302: 76
                            400: 16
                            401: 8
                            416: 2
                            Summe: 586554

                            Diesmal wird wohl irgendwo doppelt gezählt. Ich habe leider im Moment wenig Zeit (liest ja selbst Mod-Forum), sonst würde ich selbst an den RegExps schrauben.

                            Dafür hat sich die Ausführzeit um ca. 6-8 Sek. verkürzt.

                            Viele Grüße aus Frankfurt/Main,
                            Patrick

                            --

                            _ - jenseits vom delirium - _
                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                            Nichts ist unmöglich? Doch!
                            Heute schon gegökt?
                            1. Diesmal wird wohl irgendwo doppelt gezählt.

                              Kann ich bei den Tests mit meinen Logfiles nicht bestätigen. Seltsam.

                              Siechfred

                              --
                              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                              1. Hallo Siechfred!

                                Kann ich bei den Tests mit meinen Logfiles nicht bestätigen. Seltsam.

                                Ich bin gerade etwas am Überlegen... Deine Logs, besetehen sie aus neun Eintragsfeldern oder aus elf?

                                my $ua = '"([^"]+)"';     # quoted string
                                my $re = $ip.$id.$id.$dt.$rq.$sc.$sc.$id.$ua.$sp.$ua;
                                ....................................................^

                                Hier kommt bei meinen Logs noch der Proxy-Eintrag... meistens leer, doch hin und wieder steht da eine oder zwei IPs, manchmal unknown, etc...

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                                1. Re!

                                  So sieht es jetzt aus, mit dem Index 12 greife ich auf die Proxy-Einträge zurück:

                                  my $pr = '"([^"]+)"';   # quoted string (proxy)
                                  my $re = $ip.$id.$id.$dt.$rq.$sc.$sc.$id.$ua.$sp.$ua.$sp.$pr;

                                  ip     => $erg->[0],
                                  date   => $erg->[3],
                                  meth   => $erg->[4],
                                  url    => $erg->[5],
                                  proto  => $erg->[6],
                                  code   => $erg->[7],
                                  length => $erg->[8],
                                  host   => $erg->[9],
                                  ref    => $erg->[10],
                                  uas    => $erg->[11],
                                  prox   => $erg->[12]

                                  Doppelt gezählt wird trotzdem:
                                  200: 5078
                                  301: 508
                                  304: 300
                                  404: 72
                                  410: 32
                                  403: 6
                                  206: 2
                                  405: 2

                                  Aus dieser Datei (nur 3000 Zeilen, geht viel schneller für's Testen).

                                  Viele Grüße aus Frankfurt/Main,
                                  Patrick

                                  --

                                  _ - jenseits vom delirium - _
                                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                  Nichts ist unmöglich? Doch!
                                  Heute schon gegökt?
                                  1. Doppelt gezählt wird trotzdem:

                                    Nee, kann ich anhand der von Dir verlinkten Logdatei nicht nachvollziehen. Ich lade sicherheitshalber die aktuelle Modulversion noch mal hoch:

                                    http://test.anaboe.net/LogAnalyze/

                                    Siechfred

                                    --
                                    Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                                    1. Hallo Siechfred!

                                      Nee, kann ich anhand der von Dir verlinkten Logdatei nicht nachvollziehen. Ich lade sicherheitshalber die aktuelle Modulversion noch mal hoch:

                                      http://test.anaboe.net/LogAnalyze/

                                      Keine Ahnung, was dann bei mir passiert, hier mein Aufruf:

                                        
                                      use Desktop::LogAnalyze;  
                                      use Data::Dumper;  
                                      my $starttime = time();  
                                      #open OUT, ">>desktop/output/siechfred.txt";  
                                        
                                      my $log = LogAnalyze->new('local/path/logfiles') or die 'No object';  
                                      $log->getLogFile( { 'ftp'     => 'ftp.sponge.bob',  
                                                          'user'    => 'Meerjungfraumann',  
                                                          'pass'    => 'Blaubarschbube',  
                                                          'ftp_dir' => 'logs',  
                                                          'logfile' => 'access.log.current'  
                                                        }) or die $LogAnalyze::ErrorMsg;  
                                      my $hashref = $log->parseLogFile;  
                                      print Dumper $hashref;  
                                      #sleep(6);  
                                        
                                      $log->parseLogFile or die $LogAnalyze::ErrorMsg;  
                                      my $stat = $log->statTop( { level => 50, field => 'code' } );  
                                      foreach(@$stat) {  
                                        print $_->{code}, ': ', $_->{count}, "\n";  
                                      }  
                                      print $/;  
                                      my $endtime = time();  
                                      print $endtime - $starttime, " Sekunden";  
                                      
                                      

                                      Unter C:\Dokumente und Einstellungen\User\ die faked.log.current als log_2007-12-19.txt vorher abgespeichert, Ergebnis:

                                      ^Z
                                      $VAR1 = 1;
                                      200: 5078
                                      301: 508
                                      304: 300
                                      404: 72
                                      410: 32
                                      403: 6
                                      206: 2
                                      405: 2

                                      Viele Grüße aus Frankfurt/Main,
                                      Patrick

                                      --

                                      _ - jenseits vom delirium - _
                                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                      Nichts ist unmöglich? Doch!
                                      Heute schon gegökt?
                                      1. Keine Ahnung, was dann bei mir passiert, hier mein Aufruf:

                                        Sieht erstmal unverdächtig aus. Sind das die gleichen Daten, die Du mir auszugsweise zur Verfügung gestellt hast? Eine Summenkontrolle ergab bei mir immer 3.000 (oder weniger, wenn ich bspw. nur die Top 10 wollte), eine Kontrolle der geparsten Daten ergab exakt 3.000 Datensätze und keiner davon undef.

                                        my $hashref = $log->parseLogFile;
                                        print Dumper $hashref;

                                        Die Methode gibt mittlerweile nur noch 1 (Erfolg) oder 0 (Misserfolg nebst Fehlermeldung) aus, wenn Du unbedingt die kompletten Daten haben willst, kriegst Du sie über $log->{data}.

                                        Siechfred

                                        --
                                        Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                                        1. Hallo Siechfred!

                                          Sieht erstmal unverdächtig aus. Sind das die gleichen Daten, die Du mir auszugsweise zur Verfügung gestellt hast?

                                          Sieht so aus als, würde bei diesem Aufuf aus meinem vorigen Posting die Datei zwei Mal eingelesen (oder die Werte zwei Mal gespeichert):

                                          __DATA__
                                          200: 5078
                                          301: 508
                                          304: 300
                                          404: 72
                                          410: 32
                                          403: 6
                                          206: 2
                                          405: 2
                                          ^Z

                                          6000

                                          Ich kann mir aber trotzdem keinen Reim machen, warum.

                                          Eine Summenkontrolle ergab bei mir immer 3.000 (oder weniger, wenn ich bspw. nur die Top 10 wollte), eine Kontrolle der geparsten Daten ergab exakt 3.000 Datensätze und keiner davon undef.

                                          Wie kann ich mir die Zahl der eingelesenen Zeile ausgeben lassen?

                                          Die Methode gibt mittlerweile nur noch 1 (Erfolg) oder 0 (Misserfolg nebst Fehlermeldung) aus, wenn Du unbedingt die kompletten Daten haben willst, kriegst Du sie über $log->{data}.

                                          Ach ja, danke. Bei langen Logs ist es sicher vorteilhafter, den Hash zu speichern, als jedesmal die Datei neu einlesen zu lassen, oder?

                                          Viele Grüße aus Frankfurt/Main,
                                          Patrick

                                          --

                                          _ - jenseits vom delirium - _
                                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                          Nichts ist unmöglich? Doch!
                                          Heute schon gegökt?
                                          1. BINGO!

                                            Es lag am Aufruf! In meinem Posting vorhin wurde parseLogFile zwei mal aufgerufen:

                                            my $hashref = $log->parseLogFile;
                                            .
                                            .
                                            .
                                            $log->parseLogFile or die $LogAnalyze::ErrorMsg;

                                            So aber geht's:

                                            use Desktop::LogAnalyze;
                                            use Data::Dumper;

                                            my $log = LogAnalyze->new();

                                            $log->parseLogFile or die $LogAnalyze::ErrorMsg;
                                            my $stat = $log->statTop( { level => 50, field => 'code' } );
                                            foreach(@$stat) {
                                              print $_->{code}, ': ', $_->{count}, "\n";
                                            }
                                            ^Z
                                            200: 2539
                                            301: 254
                                            304: 150
                                            404: 36
                                            410: 16
                                            403: 3
                                            206: 1
                                            405: 1

                                            Viele Grüße aus Frankfurt/Main,
                                            Patrick

                                            --

                                            _ - jenseits vom delirium - _
                                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                            Nichts ist unmöglich? Doch!
                                            Heute schon gegökt?
                                          2. Eine Summenkontrolle ergab bei mir immer 3.000 (oder weniger, wenn ich bspw. nur die Top 10 wollte), eine Kontrolle der geparsten Daten ergab exakt 3.000 Datensätze und keiner davon undef.
                                            Wie kann ich mir die Zahl der eingelesenen Zeile ausgeben lassen?

                                            print scalar @{$log->{data}};

                                            Bei langen Logs ist es sicher vorteilhafter, den Hash zu speichern, als jedesmal die Datei neu einlesen zu lassen, oder?

                                            Der Hash ist zwar recht speicherintensiv, wenn er aber einmal angelegt („geparst“) ist, dann gehen die statistischen Auswertungen ziemlich fix, ja.

                                            Siechfred

                                            --
                                            Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
                                2. Ich bin gerade etwas am Überlegen... Deine Logs, besetehen sie aus neun Eintragsfeldern oder aus elf?

                                  Aus elf, müsste das erweiterte Apache-Format sein.

                                  Siechfred

                                  --
                                  Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
            2. Na dann, wolle mer ma...

              Das hier (zum Zerreißen) vorgestellte Skript »statfaker.pl« setzt voraus, dass die Logfiles nach dem selben Muster aufgebaut sind, wie hier beschrieben - das heißt, diese bestehen aus elf (11) Einträgen. Wie mir scheint, den Berichten anderer 1&1-User zu urteilen, sind die Logs bei allen Paketen nach diesem Muster aufgebaut.

              Wie mehrfach berichtet, erstellt 1&1 jeden Tag tägliche Logs (access.log.current), die am nächsten Tag gezippt werden (access.log.50.6.gz ist beispielsweise die Logdatei von gestern, Samstag, 6. Tag der Kalenderwoche 50). Zu Beginn einer neuen Woche, werden diese 7 Taglogs zu einer einzigen Wochenlog (z.B. access.log.50.gz) zusammengefügt. Insgesamt sind die jeweiligen Wochenlogs neun Wochen lang verfügbar bevor die jeweils älteste gelöscht wird.

              Mit dem bereits hier vorgestellten Skript kann man in der Woche, die der des letzen Tags des Vormonats folgt, eine Monatslog erstellen: Das Skript fügt die gezippten Wochenlogs des Vormonats zu einer einzigen Textdatei zusammen, die im Browser angezeigt wird und lokal abgespeichert werden muss. Hierfür muss das Skript auf dem Server hochgeladen werden und natürlich über den Browser aufgerufen werden. Und im Skript muss der jeweilige Monatskürzel angegeben werden (in der while-Schleife, im if-Statement bei print).

              Siechfred hat mich aber, für alle die bei 1&1 (angeblich... *g* - EngInsider wissen, was ich meine *FG*) keine eigenen CGI-Skripten laufen lassen dürfen, dank seines vorgestellten LogAnalyse.pm-Modul auf eine Idee gebracht. Das Monatslog-Erstell-Skript könnte man genausogut von der Konsole aus »bequem daheim« laufen lassen, die Monatslogs dann auf dem heimischen Rechner direkt auswerten. Denn das ist ohnehin Muss: Bei großen Dateien wird das Zusammenfüge-Skript beim Versuch, die Datei auf dem Server zu speichern, den Dienst verweigern. Die so erstellten Logs erreichen bei mir zum Teil weit über 70 MB - der zugewiesene Speicher für CGI-»Arbeiten« beträgt laut 1&1 aber nur 32 MB. Und in der Tat scheiterte mein Versuch, über CGI die Logs zu erstellen und auf dem Server zu speichern.

              Wenn man also seine Monatslogs erstellt und auf dem heimischen Rechner gespeichert hat (Monat_Jahr.txt), kann man sie mit »statfaker.pl« lokal auswerten (lokale Perl-Installation vorausgesetzt).

              Einfach über die Konsole aufrufen (Windows: cmd oder Eingabeaufforderung), Drag&Dropen ins Konsolenfenster finde ich dabei noch am Einfachsten, und schon kommt die Anforderung, Verzeichnis, Monatsnamen der entspr. Datei und Jahr einzugeben (das nur, falls man über mehrere Jahre gesammelt hat).

              Dann kommt ein Menü mit verschiedenen Optionen[1]. Einfach auswählen...

              Warum ist so ein Skript notwendig, obwohl 1&1 ab bestimmte Paketvolumen eine eigene Statistik anbietet, die auch relativ bequem über das Login erreichbar ist? Nun, mir hat ein Blick darin gereicht, um zu sehen, dass ich nur die Stats glaube, die ich selber fälsche ;)

              Wer testen will bekommt hier eine gezippte Logdatei mit 100000 Zeilen (und gefakten IPs - 1,7MB) - oder eine ungezippte, noch kürzere (3000 Zeilen, ebenfalls gefakte IPs - 700KB, muss als monat_jahr.txt gespeichert werden) und das Skript zum Abspeichern (und vorschlagen, was man beser kann - und das ist sicher viel, das weiß ich *g*).

              Ach ja, die meiste Zeit (2 Tage) ging drauf, die User-Agents auseinander zu nehmen... Was man da alles sieht, von lauter Nullen bis zu willkürlichen Buchstabenfolgen über "Geht Dich nicht an" bis zu "Husseldiguggel" (*G*, den kenne ich aber), ist kaum zu glauben. Ich bin nach dem Aussortier-Verfahren vorgegangen, erstmal die bekannten löschen, gucken was bleibt, dann weiter mit denen, die man dabei kennen gelernt hat, usw. usw. Natürlich per Skript und nur selten »de visu«, aber dennoch... Warum gibt es diesbezüglich keine Norm, in einer ansonsten bis auf jedem Zoll normierten Welt?... Jedenfalls erfordert es eine Menge RegExp, die das ganze zum Teil langsam machen...

              [1]
              Was möchten Sie ausgeben? (Verlassen mit 'Q'):
              1. Browserauswertung (alle Hits) - (bei etwas über 300000 Zeilen: 10 Sek.)
              2. Browserauswertung (besuchte Seiten) ("" "" "" "" "": 25 Sek.)
              3. Betriebssysteme ("" "" "" "" "": 10 Sek.)
              4. Meistbesuchte Seiten ("" "" "" "" "": 25 Sek.)
              5. Top 50 Referrer ("" "" "" "" "": 25 Sek.)
              6. Top 50 Suchbegriffe ("" "" "" "" "": 23 Sek.)
              7. Andere Statistikdatei auswerten

              @Siechfred: das Modul habe ich ausprobiert, funktioniert hervorragend. Ich verstehe allerdings einige Teile davon nicht, werde aber später fragen - muss erstmal, nach 2 Tagen Logs durchstudieren, etwas verschnaufen ;)

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
              1. Öh, da fehlt was...

                und ___das Skript zum Abspeichern___ (und vorschlagen, was man beser kann - und das ist sicher viel, das weiß ich *g*).

                Ja, wo isses denn?

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. und ___das Skript zum Abspeichern___ (und vorschlagen, was man beser kann - und das ist sicher viel, das weiß ich *g*).

                  Ja, wo isses denn?

                    elsif (/gecko/i && !/like.+gecko/i) {  
                      if (/jstruebig\.de"/) {  
                     $People{all}++;  
                     $People{Struppi}++;  
                        next;  
                  
                  

                  Welch Ehre ;-)

                  Struppi.

                  1. Hallo Struppi!

                    if (/jstruebig.de"/) {
                       $People{all}++;
                       $People{Struppi}++;
                    Welch Ehre ;-)

                    ;)

                    Cheatah (einer seiner Kennungen) und Martin habe ich auch schon ;)

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?
    2. Hallo Cheatah!

      meine Perl-Zeiten sind etwas lang her.

      So weit ich es in Erinnerung habe (konnte ich damals mangels Perl-Erfahrung ja nicht beurteilen), warst Du aber ziemlich fit? Warum perlst Du nicht mehr? Bist Du den Weg der Verräter gegangen, die PHP als goldenes Kalb verehren? ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hi,

        meine Perl-Zeiten sind etwas lang her.
        So weit ich es in Erinnerung habe (konnte ich damals mangels Perl-Erfahrung ja nicht beurteilen), warst Du aber ziemlich fit?

        naja. Die Objektorientierung habe ich bei Perl nie wirklich verstanden, meine Versuche der Modulerstellung sind kläglich gescheitert. Ich war zwar vielleicht fit, aber auf einem niedrigen Level der Programmierung ;-)

        Warum perlst Du nicht mehr?

        Perl wurde bei mir fast vollständig durch Python ersetzt. Dazu kamen Java, COPS[1] und ähnliche Konsorten. Mein Schwerpunkt liegt aber ohnehin eher bei JavaScript.

        Bist Du den Weg der Verräter gegangen, die PHP als goldenes Kalb verehren? ;)

        Das wird frühestens passieren, wenn PHP objektorientiert ist[2] ;-) In der Regel setze ich PHP nur auf Systemen ein, die nicht in den Live-Betrieb gehen, also z.B. um die Entwicklung von Templates zu erleichtern. Der Grund: Solche Systeme brauchen nicht stabil zu sein, und bei Bedarf können sie von Hinz und Kunz, aufgesammelt in der Fußgängerzone, weiterentwickelt werden.

        Cheatah

        [1] Wenn Du's nicht kennst, dann kennst Du's nicht ;-)
        [2] "Objektorientiert _ist_", nicht "Objektorientierung erlaubt".

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo Cheatah!

          [Objektorientierung]

          Da bin noch etwas weit davon entfernt ;)

          aber auf einem niedrigen Level der Programmierung ;-)

          Ach komm ;)

          Perl wurde bei mir fast vollständig durch Python ersetzt.

          Auf dem Server, wo meine Seiten gehostet sind, steht Python auch zur Verfügung. Aber ich weiß noch nicht, wozu man diese Schlange bewegen kann ;)

          COPS[1]
          [1] Wenn Du's nicht kennst, dann kennst Du's nicht ;-)

          Ich lebe besser, wenn ich mit Cops nichts zu tun haben. Oder eher: Wenn sie mit mir nichts zu tun haben ;)

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
  2. Hallo Patrick,

    Grund sind folgende UA-Strings (nach den besuchten Seiten zu urteilen, handelt es sich um Spammer):

    Typ 1: Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1)
    Typ 2: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 7.0; Win32; 1&1); .NET CLR 2.0.50727; IEMB3; IEMB3)
    Typ 3: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 1.1.4322)
    Typ 4: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; http://bsalsa.com)
    Typ 5: User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2)

    Wie man sieht, steht immer eine Klammer "(" vor "compatible".

    Ich möchte nun diese beknackten UAs immer der im UA-String zuerst vorkommenden Browserversion zuordnen, beim oben genannten Typ 1 soll ein MSIE 6 gezählt werden, bei Typ 3 ein MSIE 7.

    Die zuerst vorkommende Browserversion steht immer direkt nach der ersten Klammer "(".

    Also muss man eigentlich nur sicherstellen, dass immer die erste Klammer im RegExp matcht, gefolgt von dem, was man sonst noch matchen will.

    Also:
                 $allIE++ if (/[^(]+?(compatible; MSIE / && !/Opera/);
                 $anzahlIE3++ if (/[^(]+?(compatible; MSIE 3/ && !/Opera/);
                 $anzahlIE4++ if (/[^(]+?(compatible; MSIE 4/ && !/Opera/);
                 $anzahlIE5++ if (/[^(]+?(compatible; MSIE 5/ && !/Opera/);
                 $anzahlIE6++ if (/[^(]+?(compatible; MSIE 6/ && !/Opera/);
                 $anzahlIE7++ if (/[^(]+?(compatible; MSIE 7/ && !/Opera/);

    Das sollte m.E. den Anforderungen genügen.

    Gruß, Don P

    1. Hallo,

      Sorry, lieber vorsichtshalber auch noch noch den Zeilenbeginn mit einbeziehen:

      Also:
                   $allIE++ if (/[1]+?(compatible; MSIE / && !/Opera/);
                   $anzahlIE3++ if (/[2]+?(compatible; MSIE 3/ && !/Opera/);
                   $anzahlIE4++ if (/[3]+?(compatible; MSIE 4/ && !/Opera/);
                   $anzahlIE5++ if (/[4]+?(compatible; MSIE 5/ && !/Opera/);
                   $anzahlIE6++ if (/[5]+?(compatible; MSIE 6/ && !/Opera/);
                   $anzahlIE7++ if (/[6]+?(compatible; MSIE 7/ && !/Opera/);

      Gruß, Don P


      1. ^( ↩︎

      2. ^( ↩︎

      3. ^( ↩︎

      4. ^( ↩︎

      5. ^( ↩︎

      6. ^( ↩︎

    2. Hallo Don P.!

      Also muss man eigentlich nur sicherstellen, dass immer die erste Klammer im RegExp matcht, gefolgt von dem, was man sonst noch matchen will.

      Das Problem ist aber, es sind komplette Zeilen der access-log-File. Deine RegExps:

      Also:
                   $allIE++ if (/[^(]+?(compatible; MSIE / && !/Opera/);
                   $anzahlIE3++ if (/[^(]+?(compatible; MSIE 3/ && !/Opera/);
                   $anzahlIE4++ if (/[^(]+?(compatible; MSIE 4/ && !/Opera/);
                   $anzahlIE5++ if (/[^(]+?(compatible; MSIE 5/ && !/Opera/);
                   $anzahlIE6++ if (/[^(]+?(compatible; MSIE 6/ && !/Opera/);
                   $anzahlIE7++ if (/[^(]+?(compatible; MSIE 7/ && !/Opera/);

      unterschlagen mir 12 IEs bei der Gessamtzählung ($allIE), und zwar aus solchen Zeilen:

      217.6.15.133 - - [29/Oct/2007:11:05:17 +0100] "GET /1/rezept1.html HTTP/1.1" 200 5253 advent-2000.atomic-eggs.com "http://www.google.de/search?q=J%27accuse...!+(Ich+klage+an...!),+&ndsp=20&hl=de&start=70&sa=N" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 2.0.50727)" "-"

      oder:

      70.85.114.146 - - [19/Oct/2007:01:46:03 +0200] "GET /javascript:parent.theMenu.openAll/(/);/ HTTP/1.0" 404 2295 old.atomic-eggs.com "-" "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)" "-"

      Durch den Referrer in den Logfiles, der ja VOR [1] dem User-Agent erscheint, aber auch, wie man sieht, durch den Request, können Klammer auch vorher in der Zeile vorhanden sein.

      [1] Eine Logdateizeile bei meinem 1&1-Paket folgt folgendem Aufbau:

      1. IP
      2. der zweite Eintrag kann ich nicht zuordnen, werde aus der Apache-Beschreibung nicht schlau, ist aber immer -
      3. angemeldeter User(wenn vorhanden, sonst -)
      4. Datum/Zeit-String
      5. "Methode/Request Protokoll"
      6. Server Response (Status Code)
      7. Dateigröße in Bytes
      8. Domain oder Subdomain
      9. "Referrerstring" (oder "-")
      10. "User-Agent-String" (oder "-" oder "Unfug" *g*)
      11. "Proxy-IP" (wenn über Proxy und die IP wird mitgesendet)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hallo,

        Das Problem ist aber, es sind komplette Zeilen der access-log-File. Deine RegExps:

        [...]

        unterschlagen mir 12 IEs bei der Gessamtzählung ($allIE),

        Was? 12 IEs von über 100000 werden unterschlagen? Das sind ja ca. 0,1 Promille! Im Staßenverkehr ginge das locker durch, ist aber natürlich absolut intolerabel in einer Browserstatistik für den eisernen Explorer (IronIE).

        und zwar aus solchen Zeilen:

        217.6.15.133 - - [29/Oct/2007:11:05:17 +0100] "GET /1/rezept1.html HTTP/1.1" 200 5253 advent-2000.atomic-eggs.com "http://www.google.de/search?q=J%27accuse...!+(Ich+klage+an...!),+&ndsp=20&hl=de&start=70&sa=N" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 2.0.50727)" "-"

        oder:

        70.85.114.146 - - [19/Oct/2007:01:46:03 +0200] "GET /javascript:parent.theMenu.openAll/(/);/ HTTP/1.0" 404 2295 old.atomic-eggs.com "-" "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)" "-"

        Wow, und da wundert man sich noch über Bandbreitenprobleme...

        Durch den Referrer in den Logfiles, der ja VOR dem User-Agent erscheint, aber auch, wie man sieht, durch den Request, können Klammer auch vorher in der Zeile vorhanden sein.

        Na gut, dann muss man halt statt der Klammer einen anderen, eindeutigen Zeichenstring ausfindig machen oder aber, was mir sinnvoller erscheint, nicht die ganzen if-Statements nacheinander für ein und dieselbe Zeile abarbeiten, sondern z.B. eine Art Switch bemühen, so dass es pro Zeile immer nur einen Treffer geben kann.

        Gruß, Don P

        1. Hallo Don!

          Was? 12 IEs von über 100000 werden unterschlagen? Das sind ja ca. 0,1 Promille! Im Staßenverkehr ginge das locker durch,

          Ah ah... Jeder Promille zählt! Ich hatte mal zwei davon zuviel, ich weiß, wovon ich rede ;)

          (IronIE)

          :)

          Na gut, dann muss man halt statt der Klammer einen anderen, eindeutigen Zeichenstring ausfindig machen oder aber, was mir sinnvoller erscheint, nicht die ganzen if-Statements nacheinander für ein und dieselbe Zeile abarbeiten, sondern z.B. eine Art Switch bemühen, so dass es pro Zeile immer nur einen Treffer geben kann.

          Na ja, mittlerweile ist meine Auswertungsfälschung ja erfolgreich ;)

          Du schreibst sonst meistens in JavaScript-Threads, perlst Du auch manchmal?

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Hallo Patrick,

            Na ja, mittlerweile ist meine Auswertungsfälschung ja erfolgreich ;)

            Da bin ich ja beruhigt.

            Du schreibst sonst meistens in JavaScript-Threads, perlst Du auch manchmal?

            Ja, ist schon vorgekommen. Aber nicht für's Web. Mein Problem ist: Ich mag Larry Walls dicke Doku nicht. Die liest sich wie ein Roman und man braucht viel Zeit und Hirnschmalz, eine einfache gesuchte Information da raus zu klauben.

            Der Kerl scheint sich zum Teil über seine Leser lustig machen zu wollen, mit Sätzen wie sinngemäß: Es verhält sich so, oder auch so, oder anders, manchmal auch nicht, vielleicht. Ich sehe ihn grinsend vor mir, während er solche Zeilen schreibt...

            Aber eigentlich bin ich ein Fan von Perl. Eine geniale Sprache!

            BTW, kennt jemand ein besseres Perl-Buch? Ich meine eines, das mehr wie eine Referenz, nicht wie ein Harry-Potter-Schinken daher kommt?

            Gruß, Don P

            --
            sh:( fo:) ch:? rl:( br:] n4:~ ie:% mo:? va:{ js:) de:/ zu:] fl:( ss:| ls:&
            1. Hallo Don!

              Mein Problem ist: Ich mag Larry Walls dicke Doku nicht. Die liest sich wie ein Roman und man braucht viel Zeit und Hirnschmalz, eine einfache gesuchte Information da raus zu klauben.

              Meinst du perldoc? Oder das sog. Camelbook »Programmieren mit Perl«? Larry scheint selbst nicht sehr viel (mehr, aktuell) geschrieben zu haben, sowohl das Buch als auch weite Teile der Doku tragen eher die Unterschrift von Tom Christiansen. Kann mich aber irren, da ich lediglich von den aktuelleren Bänden Kenntnis habe.

              Der Kerl scheint sich zum Teil über seine Leser lustig machen zu wollen, mit Sätzen wie sinngemäß: Es verhält sich so, oder auch so, oder anders, manchmal auch nicht, vielleicht. Ich sehe ihn grinsend vor mir, während er solche Zeilen schreibt...

              Hm, ja... vor allem in den Fußnoten ist es oft der Fall...

              BTW, kennt jemand ein besseres Perl-Buch? Ich meine eines, das mehr wie eine Referenz, nicht wie ein Harry-Potter-Schinken daher kommt?

              Schon bei O'Reilly nachgeschaut, ob es nicht eine Referenz gibt?

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
      2. Re!

        1. IP
        2. der zweite Eintrag kann ich nicht zuordnen, werde aus der Apache-Beschreibung nicht schlau, ist aber immer -
        3. angemeldeter User(wenn vorhanden, sonst -)
        4. Datum/Zeit-String
        5. "Methode/Request Protokoll"
        6. Server Response (Status Code)
        7. Dateigröße in Bytes
        8. Domain oder Subdomain
        9. "Referrerstring" (oder "-")
        10. "User-Agent-String" (oder "-" oder "Unfug" *g*)
        11. "Proxy-IP" (wenn über Proxy und die IP wird mitgesendet)

        Basierend auf dem Aufbau der 1&1-Logfiles, habe ich mir einen RegExp aus einem älteren Logfile-Analyser (access.pl, nicht von mir) etwas verfeinert:

          
        ($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*             # Leerzeichen  
        $               # Stringende  
        }ox;
        

        Macht sogar Requests wie: »http://www.example.org/seite "mit" Anfuehrungszeichen "weil" manche "es" so "toll" finden« (diese werden ja in der Logfile escaped: "), ferner UAs, die ebenfalls Anführungszeichen enthalten (gibt's alles, ja):

        255.255.255.255 - - [03/Aug/2007:20:05:40 +0200] "GET / HTTP/1.0" 200 34978 www.atomic-eggs.com "http://www.courbis.fr" "<a href="http://www.courbis.fr">Courbis presente Voyage au centre de la HP48</a>" "-"

        Eine Reise durch die Logfiles ist immer spaßig! Gibt auch schlecht parsende Suchbots (s. Request... Gerade Cazoodle ist darin Weltmeister):

        111.222.111.222 - - [03/Aug/2007:00:28:01 +0200] "GET /old_news/</TITLE></HEAD> HTTP/1.0" 301 261 old.atomic-eggs.com "-" "CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler; http://www.cazoodle.com/cazoodlebot; cazoodlebot@cazoodle.com)" "-"

        Und die Geckos treiben mich noch zum Wahnsinn:

        Anzahl Gecko-Browser gesamt: 93944

        BonEcho: 4
            Camino: 25
            Firefox: 84581
            Galeon: 21
            IceWeasel: 254
            K-Meleon: 106
            Minefield: 7344
            Mozilla: 413
            MultiZilla: 6
            Netscape: 220
            SeaMonkey: 579
            Thunderbird: 5
            Andere Geckos: 386

        Wie viele gibt es denn?

        Darf's a bissi mehr sein? Ja, dann "einige" Robots, Dienste und sonstwelche »Graser«:

        Anzahl Robots und Dienste: 41057

        Ask Jeeves: 2107
            Cazoodle: 376
            Convera Crawler: 865
            Exabot: 45
            Favorstar: 35
            Googlebot: 3813
            Heritrix: 22
            Houxou Crawler: 12
            IA-Archiver: 825
            Litefinder: 1518
            MSN-Bot: 5737
            Microsoft URL Control: 258
            Perl: 171
            Python: 7
            Seekbot: 159
            Speedy Spider: 651
            SurveyBot: 6
            VisBot: 218
            VoilaBot: 14686
            W3C-Validator: 10
            Yahoo! Slurp: 9520
            YodaoBot-Image: 16

        Und zuletzt:

        Anzahl Besuche bekannter Forumer mit eigenem User-Agent: 241

        Cheatah: 8
            Martin: 143
            Struppi: 90

        ;)

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
  3. Ich möchte nun diese beknackten UAs immer der im UA-String zuerst vorkommenden Browserversion zuordnen, beim oben genannten Typ 1 soll ein MSIE 6 gezählt werden, bei Typ 3 ein MSIE 7.

    Warum? Wenn jemand hier mit Absicht irgendeinen Wert einträgt, der nicht konform ist, dann kannst du eigentlich davon ausgehen, das der UA nicht stimmt, für mich wäre die logische Konsequenz diese als 'unbekannt' zu identifizieren.

    Struppi.

    1. Hallo Struppi!

      Ich möchte nun diese beknackten UAs immer der im UA-String zuerst vorkommenden Browserversion zuordnen, beim oben genannten Typ 1 soll ein MSIE 6 gezählt werden, bei Typ 3 ein MSIE 7.
      Warum? Wenn jemand hier mit Absicht irgendeinen Wert einträgt, der nicht konform ist, dann kannst du eigentlich davon ausgehen, das der UA nicht stimmt, für mich wäre die logische Konsequenz diese als 'unbekannt' zu identifizieren.

      Habe ich mir auch überlegt... aber die Übung ist doch reizvoll oder?

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hallo Patrick!

        Warum? Wenn jemand hier mit Absicht irgendeinen Wert einträgt, der nicht konform ist,

        Ich frage mich mittlerweile, ob es sich bei den UAs, welche zweimal »compatible; MSIE X.« im String führen, wirklich um absichtlich gefakte Agents handelt. Es ist ja sonst so, dass hinter der Betriebssystemangabe noch installierte .NET Frameworks (nach Windows-Updates) o.Ä drangehängt werden. So mein IE 6:

        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)

        Und genau da, also nach dem SV1;, erscheint bei diesen »bekloppten« Agents erneut: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1). Ergibt;

        Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1))

        Es ist ansonsten keinen Fehler im String (richtige Klammerung, u.Ä). Nur dass manchmal die Browserversion differiert (siehe OP).

        Vielleicht gibt es eine Einstellung, die ich nicht kenne (oder ein Tool), der dem User ermöglicht, diese .NET-Angabe(n) zu entfernen und dabei, sach ich mal, shit baut? Hat jemand vielleicht schon davon gehört?

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
  4. Hallo Patrick,

    Opera: 7694 (2.49% aller Hits)

    dieser niedrige Wert wundert mich. Liegt es daran, dass Opera sich AFAIK bis Version 8.x "von Haus aus" noch als IE ausgegeben hat?

    Yahoo! Slurp: 9552 (3.09% aller Hits)

    Wow. Ich habe noch keine Volkszählung über die Logs veranstaltet, ich schau sie mir nur aus Neugier immer mal wieder unfrisiert an; aber rein beim Drüberlesen ist mir Yahoo Slurp auch schon beeindruckend oft aufgefallen.

    Ich habe dennoch keine Idee mehr, wie ich vorgehen soll. Wer bringt mir den entsprechenden Denkschubs, wie ich meine Auswertung wieder »gerade fälsche«? :)

    Ich kann dir da leider nicht helfen. Aber ehrlich gesagt sehe ich auch deine Motivation nicht. Welchen Zweck verfolgst du mit dieser akribischen Auswertung?
    Und nur aus reiner Neugier gefragt: Als was würde mein UA bei dir gewertet, den ich bei allen Browsern gleich ausgeben lasse und der mehrfach im Archiv zu finden ist?

    Schönen Abend noch,
     Martin

    --
    Wer im Steinhaus sitzt, soll nicht mit Gläsern werfen.
    1. Moin Moin!

      Opera: 7694 (2.49% aller Hits)

      dieser niedrige Wert wundert mich. Liegt es daran, dass Opera sich AFAIK bis Version 8.x "von Haus aus" noch als IE ausgegeben hat?

      Nicht, wenn die Browser-Tests mit $useragent=~/Opera/ arbeiten, denn auch im IE-Mode hat der alte Opera ein "Opera" im User-Agent-String.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    2. Hallo Martin!

      [Opera]

      Opera: 11544 (4.38% aller Hits) <- August
      Opera: 9004 (3.34% aller Hits) <- September
      Opera: 7694 (2.49% aller Hits) <- Oktober
      Opera: 10286 (3.50% aller Hits) <- November

      Wie Du siehst, ist es nur im Oktober so niedrig ;) Aber ansonsten kommt es hin, und sehr zum Leidwesen der Opera-Junkies, so viele Norweger-Freunde gibt es halt nicht ;)

      Liegt es daran, dass Opera sich AFAIK bis Version 8.x "von Haus aus" noch als IE ausgegeben hat?

      Dass ich ihn falsch, also als IE zähle, schließt schon die Abfrage aus:

      $allIE++ if (/compatible; MSIE / && !/Opera/);

      Denn auch als IE getarnt hatte Opera immer noch seinen Namen am Ende des UA-Strings (gefolgt von [de], [en], etc...).

      Die Abfrage für Opera sieht so aus:

      $opera++ if (m!Opera ! || m!Opera/!);

      Yahoo! Slurp: 9552 (3.09% aller Hits)
      Wow. Ich habe noch keine Volkszählung über die Logs veranstaltet, ich schau sie mir nur aus Neugier immer mal wieder unfrisiert an; aber rein beim Drüberlesen ist mir Yahoo Slurp auch schon beeindruckend oft aufgefallen.

      Den Vogel schießt VoilaBot ab (mit unnützen Requests auf immer wieder die gleichen Seiten... das Tolle: Nach jedem Request holt er sich jedesmal erneut die robots.txt. Aber wenn man sieht, wer dahinter steckt [Orange, alias France Telecom], wundert mich nichts mehr):

      VoilaBot: 14686 (4.74% aller Hits) für Oktober

      Ich habe VoilaBot heute in der robots.txt ausgesperrt (falls es je etwas bringt, da er anscheinend nicht immer die Anweisungen der robots.txt befolgt).

      Welchen Zweck verfolgst du mit dieser akribischen Auswertung?

      Spaß an Stats... Meine pers. Auswertung haben wollen? Frag doch Ingo T., warum er ein eigenes Auswertungsprogramm geschrieben hat ;)

      Und nur aus reiner Neugier gefragt: Als was würde mein UA bei dir gewertet, den ich bei allen Browsern gleich ausgeben lasse und der mehrfach im Archiv zu finden ist?

      Wie lautet denn Dein UA (Struppis kenne ich, letztens auf der täglichen Logauswertung gesehen)?

      Sonst würde er - wie Struppis - unter »Exoten« ausgewertet, das heißt im Sammelpott landen - für alle UAs, die nicht zuzuordnen sind.

      So, und jetzt teste ich nochmals die vorgeschlagenen Lösungen aus, die Summe stimmt immer noch nicht... ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hallo,

        Opera: 11544 (4.38% aller Hits) <- August
        Opera: 9004 (3.34% aller Hits) <- September
        Opera: 7694 (2.49% aller Hits) <- Oktober
        Opera: 10286 (3.50% aller Hits) <- November
        Wie Du siehst, ist es nur im Oktober so niedrig ;) Aber ansonsten kommt es hin, und sehr zum Leidwesen der Opera-Junkies, so viele Norweger-Freunde gibt es halt nicht ;)

        versteh ich nicht - und vor allem: Firefox hat rund den zehnfachen Anteil, das versteh ich erst recht nicht. Andersrum würd's mir ja einleuchten ...

        Liegt es daran, dass Opera sich AFAIK bis Version 8.x "von Haus aus" noch als IE ausgegeben hat?
        Dass ich ihn falsch, also als IE zähle, schließt schon die Abfrage aus:
                    $allIE++ if (/compatible; MSIE / && !/Opera/);

        Das hatte ich überlesen; soviel hätte ich von deinem Script auch noch begreifen müssen, auch wenn ich Null Ahnung von Perl habe.

        Denn auch als IE getarnt hatte Opera immer noch seinen Namen am Ende des UA-Strings (gefolgt von [de], [en], etc...).

        Stimmt.

        Den Vogel schießt VoilaBot ab (mit unnützen Requests auf immer wieder die gleichen Seiten...

        Der ist mir noch nicht begegnet.

        Welchen Zweck verfolgst du mit dieser akribischen Auswertung?
        Spaß an Stats... Meine pers. Auswertung haben wollen?

        Okay, das ist Grund genug für mich. :-)
        Ich dachte, es ginge vielleicht um ein rationaleres Ziel.

        Und nur aus reiner Neugier gefragt: Als was würde mein UA bei dir gewertet, den ich bei allen Browsern gleich ausgeben lasse und der mehrfach im Archiv zu finden ist?
        Wie lautet denn Dein UA (Struppis kenne ich, letztens auf der täglichen Logauswertung gesehen)?

        http://forum.de.selfhtml.org/archiv/2006/2/t123920/#m798285

        Sonst würde er - wie Struppis - unter »Exoten« ausgewertet, das heißt im Sammelpott landen - für alle UAs, die nicht zuzuordnen sind.

        Okay, dann lande ich also unter "Sonstige", schon klar.

        So long,
         Martin

        --
        Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant.
        Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion.
        1. Hi,

          [geringer Opera-Anteil]

          versteh ich nicht - und vor allem: Firefox hat rund den zehnfachen Anteil, das versteh ich erst recht nicht. Andersrum würd's mir ja einleuchten ...

          tja, willkommen in der Realität. Eine mir vorliegende Auswertung über die User-Agent-Strings, die über mehr als 200 Millionen Aufrufe gemessen wurden, bescheinigt einen Opera-Anteil von gerade mal 1.61% (v9.0 1.41%, v8.x 0.11%). Und nach meiner Beurteilung ist die Auswertung so gut, wie sie auf Basis eines User-Agent-Strings sein kann. Firefox kommt auf das 20-fache (32.07%; v2.0 27.22%, v1.5 3.05%, v1.0 1.7%), der IE auf 63.57% (v6.0 38.99%, v7.0 23.66%). Safari erhält 1.52%.

          Über die Aussagekraft und Repräsentativität solcher Statistiken brauche ich ja nichts zu sagen ;-)

          Okay, dann lande ich also unter "Sonstige", schon klar.

          Die kommen in o.g. Statistik übrigens auf 0.1%.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Hallo Cheatah!

            tja, willkommen in der Realität. Eine mir vorliegende Auswertung über die User-Agent-Strings, die über mehr als 200 Millionen Aufrufe gemessen wurden, bescheinigt einen Opera-Anteil von gerade mal 1.61% (v9.0 1.41%, v8.x 0.11%). Und nach meiner Beurteilung ist die Auswertung so gut, wie sie auf Basis eines User-Agent-Strings sein kann. Firefox kommt auf das 20-fache (32.07%; v2.0 27.22%, v1.5 3.05%, v1.0 1.7%), der IE auf 63.57% (v6.0 38.99%, v7.0 23.66%). Safari erhält 1.52%.

            Zur Beruhigung von Martin muss ich sagen, dass die Logfiles ja jede Anfrage protokollieren, also auch Bilder/Grafiken. Wenn irgendwelche Opera-User nun die Anzeige von Grafiken deaktiviert haben, werden diese (nehme ich an) nicht geladen - sicher bin ich mir noch nicht, weil bestimmte Seiten, die ich besuchen, zicken - und da vermute ich, dass die Grafiken sehr wohl geladen, nur eben nicht angezeigt werden - und in dem Fall gibt es auch keinen Logeintrag.

            Bei old.atomic-eggs.com habe ich einen Zähler, der nur die Besuche ausgewählter Seiten protokolliert, da gibt es schon kleinere Verschiebungen in den Zahlen. Solche geringfügig andere Zahlen hätte ich sicher auch, wenn ich aus den access-Logs nur die Seitenbesuche auswerten würde, also alles was nur auf .shtml, .html, .htm, .cgi, .pl o.Ä. zutrifft.

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Hi,

              Zur Beruhigung von Martin muss ich sagen, dass die Logfiles ja jede Anfrage protokollieren, also auch Bilder/Grafiken.

              zur Beunruhigung von Martin muss ich sagen, dass dies bereits beachtet wurde. Wie ich schon erwähnte: Die Statistik ist so gut, wie sie auf Basis eines User-Agent-Strings nur sein kann.

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
        2. Hallo Martin!

          versteh ich nicht - und vor allem: Firefox hat rund den zehnfachen Anteil, das versteh ich erst recht nicht. Andersrum würd's mir ja einleuchten ...

          Wieso? Firefox war sofort ein Senkrechtstarter, schon nach der ersten »Veröffentlichung«. Diesen »Marktanteil« von ca. +/- 30% hält sich mittlerweile konstant. Opera war nie ein Renner. Wie kommst Du darauf, dass er bedeutender sein sollte?

          Das hatte ich überlesen; soviel hätte ich von deinem Script auch noch begreifen müssen, auch wenn ich Null Ahnung von Perl habe.

          OK, das mit Perl lasse ich noch durchgehen. Aber RegExp ist RegExp ;) Und in beiden bin ich noch weit davon entfernt, ein Profi zu sein ;)

          Den Vogel schießt VoilaBot ab (mit unnützen Requests auf immer wieder die gleichen Seiten...
          Der ist mir noch nicht begegnet.

          Keine Ahnung wie dieser Bot »mich« gefunden  hat. Ich nehme an, über irgendwelche Links im alten SELFHTML Forum en français (ist nun offline). Das Teil nervt wie gesagt deswegen, weil es immer nur die gleichen Seiten anfordert, und nach jedem Request die robots.txt noch mal sehen will.

          Ich dachte, es ginge vielleicht um ein rationaleres Ziel.

          Und an welches Ziel dachtest Du?

          Okay, dann lande ich also unter "Sonstige^WExoten", schon klar.

          Na klar!

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Hallo,

            versteh ich nicht - und vor allem: Firefox hat rund den zehnfachen Anteil, das versteh ich erst recht nicht. Andersrum würd's mir ja einleuchten ...
            Wieso? Firefox war sofort ein Senkrechtstarter, schon nach der ersten »Veröffentlichung«. Diesen »Marktanteil« von ca. +/- 30% hält sich mittlerweile konstant. Opera war nie ein Renner. Wie kommst Du darauf, dass er bedeutender sein sollte?

            ich habe hypothetisch von der Benutzerfreundlichkeit auf die Verbreitung geschlossen. Dass das nicht den Tatsachen entspricht, ist mir bekannt.

            OK, das mit Perl lasse ich noch durchgehen. Aber RegExp ist RegExp ;)

            Die Dinger sind mir aber auch noch ziemlich suspekt und ein Buch mit sieben Siegeln.

            Ich dachte, es ginge vielleicht um ein rationaleres Ziel.
            Und an welches Ziel dachtest Du?

            Nichts spezifisches, aber oft haben die Leute ja ein sehr konkretes Ziel vor Augen, wenn sie derartige Fragen stellen.

            Ciao,
             Martin

            --
            Der Mensch denkt, Gott lenkt.
            Der Mensch dachte, Gott lachte.
            1. Aber RegExp ist RegExp ;)
              Die Dinger sind mir aber auch noch ziemlich suspekt und ein Buch mit sieben Siegeln.

              Ach komm, RegExp ist auch nichts anderes als eine Fremdsprache. Ich finde nicht, dass Reguläre Ausdrücke an sich schwer sind, sondern dass das Formulieren der zu übersetzenden Regel in Normaldeutsch die größte Hürde ist. Hast Du die Regel erstmal formuliert, ist die Übersetzung in RegExp'sch meist gar nicht mehr sooo schlimm, zumal die RegExp-Vokabeln nicht das Problem sind, schwierig ist da schon die Grammatik (z.B. verschachtelte Lookarounds).

              Aber ein kleines bisschen Talent für Fremdsprachen sollte man haben, denke ich :)

              Siechfred

              --
              Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
    3. Hallo Martin!

      Ich habe noch keine Volkszählung über die Logs veranstaltet,

      Das ist aber sehr interessant. Jetzt, wo ich sowohl Struppis als auch Deinen UA kenne... Nun, schaunmerma:

      August:

      Wie viele Requests von Struppi: 63
      Wie viele Requests von Martin: 119
      Wie viele Forumsbeitraege von mir hat Struppi gelesen: 2
      Wie viele Forumsbeitraege von mir hat Martin gelesen: 119

      September:

      Wie viele Requests von Struppi: 13
      Wie viele Requests von Martin: 624
      Wie viele Forumsbeitraege von mir hat Struppi gelesen: 13
      Wie viele Forumsbeitraege von mir hat Martin gelesen: 254

      Oktober:

      Wie viele Requests von Struppi: 90
      Wie viele Requests von Martin: 143
      Wie viele Forumsbeitraege von mir hat Struppi gelesen: 13
      Wie viele Forumsbeitraege von mir hat Martin gelesen: 84

      November:

      Wie viele Requests von Struppi: 32
      Wie viele Requests von Martin: 309
      Wie viele Forumsbeitraege von mir hat Struppi gelesen: 4
      Wie viele Forumsbeitraege von mir hat Martin gelesen: 18

      Du findest meine Beiträge interessanter als Struppi es tut ;) Warum aber gerade im September so viel, muss ich noch erforschen... Aber es kann ja auch sein, dass andere den selben UA benutzen?

      Die Abfrage quick&dirty und für'n Spaß:

      $struppi++ if /jstruebig.de"/;
        $martin++ if m!Mozilla/4.0 (compatible; Generic Browser; Win32)!;
        $forumstruppi++ if /GET.+(clubsig|zensstop|fuernA).gif.+jstruebig.de"/;
        $forummartin++ if m!GET.+(clubsig|zensstop|fuernA).gif.+Mozilla/4.0 (compatible; Generic Browser; Win32)!;

      ich schau sie mir nur aus Neugier immer mal wieder unfrisiert an;

      Dann bist Du nicht neugierig genug. Erst die Auswertung macht Spaß. Und wenn die Logfiles sehr lange sind, ist ein einfaches drüberfliegen nicht sehr zielführend und interessante Sachen entdeckt man da nur durch Zufall...

      Ich habe noch ein Skript, der mir die von 1&1 bereitgestellten, täglichen Logs nach UA und IP gruppiert auswertet, da schaue ich mehrmals am Tag 'rein und kann so sehen, wie lange ein Besucher verweilt, was er sich angeschaut hat, etc...

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Hallo,

        einen Moment, nur dass ich deine folgende Statistik richtig einordnen kann: Wieviele Forumsbeiträge jemand von dir gelesen hat, könntest du ja daraus ableiten, wie oft das Bild in deiner Signatur von demjenigen abgerufen wurde. Worauf beziehst du dann die Anzahl der Requests? Mir ist deine Abfragegrundlage nicht klar.

        Wie viele Requests von Struppi: 63
        Wie viele Requests von Martin: 119

        Requests worauf? Aufs gesamte SELFForum? Kann ich mir nicht vorstellen, das müssten mehr sein. Oder auf atomic-eggs? Da bin ich eigentlich höchst selten, wenn ich nicht gerade "zufällig" das Bild aus deiner Sig abrufe.

        Wie viele Forumsbeitraege von mir hat Struppi gelesen: 2
        Wie viele Forumsbeitraege von mir hat Martin gelesen: 119

        Das würde heißen, jeder meiner oben gezählten Requests entspricht einem Posting von dir, das ich gelesen habe. Die Übereinstimmung ist seltsam, denn erstens glaube ich nicht, dass ich alle deine Postings gelesen habe (z.B. im Themenbereich Perl bestimmt nicht), zweitens habe ich wahrscheinlich den einen oder anderen Beitrag von dir mehrfach abgerufen bzw. gelesen, und drittens lese ich im Forum ja noch mehr.

        Du findest meine Beiträge interessanter als Struppi es tut ;)

        Schon möglich. ;-)

        Warum aber gerade im September so viel, muss ich noch erforschen...

        Das könnte daran liegen, dass ich im September zwei Wochen Urlaub hatte und einen großen Teil der Zeit zuhause war und Zeit hatte. Könnte aber auch sein, dass das gerade die Zeit war, als ich deine Website mal etwas gründlicher angeschaut habe.

        Aber es kann ja auch sein, dass andere den selben UA benutzen?

        Kann ich nicht ausschließen, ist aber doch recht unwahrscheinlich.

        ich schau sie mir nur aus Neugier immer mal wieder unfrisiert an;
        Dann bist Du nicht neugierig genug. Erst die Auswertung macht Spaß.

        Ja, stimmt - die mache ich dann aber nur punktuell an Stellen, die beim Anschauen interessant aussehen.

        So long,
         Martin

        --
        Faulheit ist, mit dem Cocktailshaker in der Hand auf das nächste Erdbeben zu warten.
        1. Hallo Martin!

          einen Moment, nur dass ich deine folgende Statistik richtig einordnen kann: Wieviele Forumsbeiträge jemand von dir gelesen hat, könntest du ja daraus ableiten, wie oft das Bild in deiner Signatur von demjenigen abgerufen wurde.

          Genau das mache ich. Wobei ich nicht sicher bin, wenn ein Browser das Bild gecached hat und deswegen (eine Weile) nicht mehr anfordert, wie es sich dann verhält.

          Worauf beziehst du dann die Anzahl der Requests? Mir ist deine Abfragegrundlage nicht klar.

          Requests sind alle angeforderten Ressourcen auf meinem Server. Also alles, was in diesem Fall von Deinem (oder Struppis) Client (erkannt anhand des User Agents) mittels GET angefordert wurde. Das betrifft sowohl alle Bilder (wenn Du eine normale Seite auf atomic-eggs.com besuchst, werden einige Bilder angefordert, wie z.B. Eicons, Rahmen für den Inahlt-DIV, Leuchtdioden, und was weiß ich noch *g*) als auch .css und .js-Dateien. Das hat nichts mit dem Forum zu tun:

          $struppi++ if /jstruebig.de"/;
            $martin++ if m!Mozilla/4.0 (compatible; Generic Browser; Win32)!;

          Hier suche ich nur die Zeilen, die den String »jstruebig.de« (bei $struppi) und den String »Mozilla/4.0 (compatible; Generic Browser; Win32)« (also Dein User Agent) in Deinem Fall enthalten. Somit erhalte ich die Anzahl aller »Requests« (oder Hits, oder Anfragen, oder angeforderten Ressourcen).

          Für die Anzahl der Forumsbeiträge hole ich, wie von Dir richtig vermutet, meine Signatur zur Hilfe (bzw. meine verschiedenen Sig-Bilder):

          $forumstruppi++ if /GET.+(clubsig|zensstop|fuernA).gif.+jstruebig.de"/;
            $forummartin++ if m!GET.+(clubsig|zensstop|fuernA).gif.+Mozilla/4.0 (compatible; Generic Browser; Win32)!;

          Da es aber jede Menge andere Leute gibt, die meine Beiträge lesen, frage ich auch noch nach Eurem (Struppis und Deinem) UA. So weiß ich mit ziemlich genauer Sicherheit, dass Ihr so und so oft Beiträge von mir - zumindest geöffnet - habt (dass Ihr sie gelesen habt, gehe ich in Eurem Fall ja aus *g*).

          Struppi liest weniger Beiträge, nicht deswegen, weil er mich für ein arrogantes Etwas hält, sondern weil er vermutlich mehr filtert (hat er ja auch zugegeben).

          Das würde heißen, jeder meiner oben gezählten Requests entspricht einem Posting von dir,

          Nein, siehe oben.

          Die Übereinstimmung ist seltsam

          Ist sie auch. Nur kann es sein, dass Du in dem Monat nur (einige) meiner Forumsbeiträge gelesen hast (Request meines Sig-Bilds mit deinem User-Agent) und ansonsten meine Seiten nie besucht hast.

          O, denn erstens glaube ich nicht,

          Das könnte daran liegen, dass ich im September zwei Wochen Urlaub hatte und einen großen Teil der Zeit zuhause war und Zeit hatte. Könnte aber auch sein, dass das gerade die Zeit war, als ich deine Website mal etwas gründlicher angeschaut habe.

          Soso... und auch noch ohne JavaScript, was? *neck*

          Kann ich nicht ausschließen, ist aber doch recht unwahrscheinlich.

          Meine ich auch.

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Re!

            Struppi liest weniger Beiträge, nicht deswegen, weil er mich für ein arrogantes Etwas hält, sondern weil er vermutlich mehr filtert (hat er ja auch zugegeben).

            Vor allem blendet er Threads aus, von dem er meint, die hätten sich auf welcher Weise auch immer »erledigt«... ob ihm dabei was entgeht, muss er selbst beurteilen, spätestens im Archiv ;)

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Struppi liest weniger Beiträge, nicht deswegen, weil er mich für ein arrogantes Etwas hält, sondern weil er vermutlich mehr filtert (hat er ja auch zugegeben).

              ;-)

              Vor allem blendet er Threads aus, von dem er meint, die hätten sich auf welcher Weise auch immer »erledigt«... ob ihm dabei was entgeht, muss er selbst beurteilen, spätestens im Archiv ;)

              Bei der Masse an Threads ist das reiner Selbstschutz. Ich warte mittlerweile auch oft länger bevor ich antworte oder lese (z.b. wie hier), das Forum kostet schon viel Zeit und ich bin komm momentan mit einigen Projekten nicht voran.

              Struppi.

      2. Hi,

        Ich habe noch ein Skript, der mir die von 1&1 bereitgestellten, täglichen Logs nach UA und IP gruppiert auswertet, da schaue ich mehrmals am Tag 'rein und kann so sehen, wie lange ein Besucher verweilt, was er sich angeschaut hat, etc...

        das ist sowieso das Interessanteste an den Logs und zentraler Bestandteil meines Auswertungsprogramms, wobei die unwichtigen Dateien (CSS, JS und Bilder) ausgeblendet sind und vor allem auch IP-Wechsel einigewrmaßen zuverlässig berüclsichtigt werden - also z.B. auch der Weg eines AOL-Users ersichtlich ist.

        Übrigens zu den 1&1 Wochenlogs: die hole ich mir zeitsparend als gz, packe sie aus und füge sie mit einem kleinen DOS-Programm zu Monatslogs zusammen. Der Server muss dazu gar nichts machen.

        freundliche Grüße
        Ingo

        1. Hallo Ingo!

          Übrigens zu den 1&1 Wochenlogs: die hole ich mir zeitsparend als gz, packe sie aus und füge sie mit einem kleinen DOS-Programm zu Monatslogs zusammen. Der Server muss dazu gar nichts machen.

          Ich habe dazu ein Perl-Skript[1] und muss gar nichts gz-mäßig herunterladen ;)

          Ob das auch noch (denke ich schon) funktioniert und wie lange es dauert, wenn die gezippten Wochenlogs aus mehreren 100 MBs bestehen, kann ich nicht sagen... ich denke, für die meisten von uns hier lesenden wird es reichen (oder wer hat schon mehrere Millionen Hits im Monat[2]? *g*).

          [1]

            
          #!/usr/bin/perl -w  
            
          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);  
            }  
          }  
          
          

          [2] Ich komme auf zw. 250000 und 320000 Hits (Logdateizeilen) im Monat

          Ach ja, am Ball bleiben. Gleich stelle ich im Siechfred-Patrick-Zweig »UA-Statistiken fälschen« mein neues »statfaker.pl« zur Diskussion (oh je... *g* - im Vergleich zum modularen Siechfred-Skript sieht meins schlecht aus)...

          Und ich habe Dich vermisst! Um über Statistiken oder/und über Spam zu reden, bist Du der unschlagbare Partner!

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
          1. Hi,

            Ich habe dazu ein Perl-Skript[1] und muss gar nichts gz-mäßig herunterladen ;)

            was heißt "muss"? Ich mache das lieber, als die 20 mal größeren unkomprimerten Daten.

            my @weeks = (1..52);

            damit wird Dir z.B. am 28.12.09 ein Woche fehlen..;-)

            Und ich habe Dich vermisst! Um über Statistiken oder/und über Spam zu reden, bist Du der unschlagbare Partner!

            danke - übrigens auch für Deine Satistiken, aus denen ich mir anfangs den Großteil der Telekom, Googlebot, msnbot und arcor IP-Zuordnungen für mein Programm herausgeholt hatte.
            Ich stelle gerade fest, dass ich den Code dazu zwar lange nicht mehr genutzt habe un er vielleicht auch nicht mehr für Deine Seiten passt, er aber immer noch in meinem Source steht:

            CompilerIf #TestMode  
              Procedure PruefeIPDateien(TestModeIPs)  
                If TestModeIPs = -1  
                  Dim Feld.s(Hits) : ResetArrays(-1, 0)  
                  If Textzeile(0) = "<html>"  
                    For i = 1 To Hits  
                      If Left(Textzeile(i), 17) = "<td align=center>"  
                        p = FindString(Textzeile(i+2), ".t-", 5)  
            ...
            

            freundliche Grüße
            Ingo

            1. Hallo Ingo!

              my @weeks = (1..52);
              damit wird Dir z.B. am 28.12.09 ein Woche fehlen..;-)

              Huch... Jahre mit 53 Wochen? Dann sind Woche 1 und 53 nur Bruchstücke ;) Aber danke, wird geändert ;)

              Ach ja, ich habe noch nicht mal einen 2008-Kalender, da mache ich mir um 2009 keine Gedanken ;)

              Und ich habe Dich vermisst! Um über Statistiken oder/und über Spam zu reden, bist Du der unschlagbare Partner!
              danke - übrigens auch für Deine Satistiken,

              Meinst Du die alten old.atomic-eggs.com-Statistiken?

              Ich stelle gerade fest, dass ich den Code dazu zwar lange nicht mehr genutzt habe un er vielleicht auch nicht mehr für Deine Seiten passt

              Wenn das die alten Stats sind, da habe ich glaube ich nichts geändert...

              CompilerIf #TestMode

              Procedure PruefeIPDateien(TestModeIPs)
                  If TestModeIPs = -1
                    Dim Feld.s(Hits) : ResetArrays(-1, 0)
                    If Textzeile(0) = "<html>"
                      For i = 1 To Hits
                        If Left(Textzeile(i), 17) = "<td align=center>"
                          p = FindString(Textzeile(i+2), ".t-", 5)
              ...

                
              Was für eine Sprache? Verstehe nichts ;)  
                
                
              Viele Grüße aus Frankfurt/Main,  
              Patrick
              
              -- 
              ![](http://www.atomic-eggs.com/fuernA.jpg)  
                
              \_ - jenseits vom delirium - \_  
                
              [[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash](http://www.atomic-eggs.com/)]  
              Nichts ist unmöglich? [Doch!](http://www.atomic-eggs.com/cwi/cwi_4.shtml)  
              Heute schon ge[gök](http://goek.atomic-eggs.com/goek_goek.html)t?
              
              1. Hi,

                Huch... Jahre mit 53 Wochen? Dann sind Woche 1 und 53 nur Bruchstücke ;)

                sowas kann man berechnen und wenn ich das richtig programmiert habe, fängt die 1. KW 2012 bis 2014 sogar bereits im Vorjahr an und 2015 gibt's dann wieder eine 53. Woche.

                Meinst Du die alten old.atomic-eggs.com-Statistiken?

                ja klar. Ich hatte mir über die URL hin und wieder die IPs für einen sehr großen Zeitraum anzeigen lassen und mir dann die IPs zu den entsprechenden DNS-Angaben sortiert ausgeben lassen. Mein Mini-webspace bei 1&1 hat ja leider kein PHP.

                Was für eine Sprache? Verstehe nichts ;)

                brauchst Du auch nicht... Ist ein Basic-Dialekt für einen Compiler, der wirklich schnellen Maschinencode daraus erstellt.

                Ich habe mir übrigens Dein 100000-Zeilen Log mal vorgenommen...
                Schade, dass Du die IPs so durcheinandergewürfelt hast und dadurch IP-Wechsel eines Besuchers nicht erkannt werden konnten. Wieso nur hast Du meinen Zugriffen über Arcor eine IP der Lithuanian Telecom gegeben? ;-)

                Mir fielen die vielen 301 und 404 auf. Z.B. hier:
                 357:*Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
                      Ref: http://forum.de.selfhtml.org/archiv/2001/5/t23531/
                [09:24:51] 301 /daten/86.html
                [09:24:51] 301 /selfspezial/daten/86.html
                [09:24:52]     /cgi-bin/counter.cgi?seite=ssp_410&ref=http://forum.de.selfhtml.org/archiv/2001/5/t23531/&auf=1152x864&win=0&farb=32
                [09:24:52] 404 /favicon.ico
                [09:24:52]     /410.html

                Da schickst Du die armen User über zwei Zwischenstationen zu einer Gone-Seite, die Du mit 200 auslieferst...

                Nett fand ich:
                [Google Suchanfragen: 1009]
                  121* Geburtstagskarten
                   30* cd labels
                   28* schriftarten
                   23* smart roadster
                   21* autorun.inf
                   14* teletubbis
                   11* Muschelzubereitung
                   11* gästebuch
                   10* gästebuch downloaden
                   10* cd hüllen
                   10* autorun html
                    8* gemeinheiten
                ...

                Und hier:
                [ausgelieferte Seiten: 23202]  [PageImpressions: 23310]
                 1025* /
                  436* /410.html
                  369* /2/0209dodo.shtml
                  336* /old_news/autorun.html
                  334* /skarten.html
                  329* /cgi-bin/guest/guest.pl
                  315* /guests/advguest.cgi?view
                ...
                ist schon etwas traurig, dass diese Gone-Seite am zweithäufigsten angefordert wurde.

                Interessant vielleicht auch die
                [Top20 Einstiegsseiten von: 2151]
                  512* /
                  259* /smartie5.jpg
                  246* /selfspezial/atomicegg.gif
                  229* /cgi-bin/guest/guest.pl
                  194* /skarten.html
                  168* /old_news/autorun.html
                  158* /old_news/labels.html
                  130* /guests/advguest.cgi?view
                ...

                Aber Dich könnte meine Browserauswerung onteressieren:
                [Browser: 7085]
                 34,6% MSIE 6
                 25,4% Geckos
                 15,7% MSIE 5.x
                 11,4% MSIE 7
                  2,8% Opera
                 10,1% andere erkannte Browser

                2317* MSIE 6
                 1418* Firefox/Iceweasel (1234* Firefox 2)
                  766* MSIE 7
                  759* MSIE 5.5
                  558* MSIE 4
                  290* MSIE 5
                  187* Opera (66* Opera 9)
                  184* Mozilla
                  100* MSIE Mac
                   55* Safari
                   22* Konqueror
                   10* SeaMonkey
                    8* Netscape 4
                    5* Netscape 7
                    5* MSIE ?
                    4* Galeon
                    1* Netscape 8
                    1* Lynx
                  223* unbekannt (-> andere Kennungen)
                  163* keine Browserkennung

                14* OfflineReader (5* MSIECrawler)
                  431* IE Favorit gesetzt (-> *'Browser' in Filteransicht)
                    3* (W3C) Validator

                [Robots: 3435]
                 2163* Inktomi's Web Robot (Yahoo! ...)
                  582* MSN Robot
                   92* Googlebot
                   70* alexa Robot
                    4* Seekport.de
                    3* Xenu's Link Sleuth (broken links)
                  521* andere Robots (Anmerkung: Dein Lieblinksbot läuft bei mir nur hier unter Sonstige)

                [andere Kennungen: 223]
                   32* Mozilla/4.0
                   16* bot/1.0 (bot; http://; bot@bot.bot)
                   13* voyager/1.0
                   13* heeii/Nuts Java/1.5.0_10
                   11* Mozilla/5.0 (compatible; jobs.de-Robot +http://www.jobs.de)
                   11* Mozilla/4.0 (compatible;)
                   10* Java/1.5.0_11
                    9* CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler; http://www.cazoodle.com/cazoodlebot; cazoodlebot@cazoodle.com)
                    7* MSRBOT (http://research.microsoft.com/research/sv/msrbot/
                    7* Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)
                    6* Sunrise/0.42j (Windows XP)
                    6* Mozilla/3.0 (compatible; WebCapture 2.0; Auto; Windows)
                    6* chudo
                    4* VisBot/2.0 (Visvo.com Crawler; http://www.visvo.com/bot.html; bot@visvo.com)
                    4* libwww-perl/5.808
                    4* libwww-perl/5.803
                    3* shelob v1.0
                    3* PHP/3.0.18
                    3* Nokia6682/2.0 (3.01.1) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 configuration/CLDC-1.1 UP.Link/6.3.0.0.0 (compatible;YahooSeeker/M1A1-R2D2; http://help.yahoo.com/help/us/ysearch/crawling/crawling-01.html)
                    3* Html Link Validator (www.lithopssoft.com)
                    3* holmes/3.11 (OnetSzukaj/5.0; +http://szukaj.onet.pl)
                    2* Mozilla/5.0 (compatible; Gigamega.bot/1.0; +http://www.gigamega.net/bot.html)
                    2* MJ12bot/v1.2.0 (http://majestic12.co.uk/bot.php?+)
                    2* libwww-perl/5.805
                    2* libwww-perl/5.79
                    2* libwww-perl/5.76
                    2* HouxouCrawler/Nutch-0.8.2-dev (houxou.com's nutch-based crawler which serves special interest on-line communities; http://www.houxou.com/crawler; crawler at houxou dot com)
                    2* ConveraCrawler/0.9e (+http://www.authoritativeweb.com/crawl)
                    1* yacybot (ppc Mac OS X 10.4.10; java 1.4.2_12; Europe/de) http://yacy.net/bot.html
                    1* yacybot (amd64 Linux 2.6.18; java 1.5.0_10; GMT/en) http://yacy.net/bot.html
                    1* WebCorp/1.0
                    1* User-Agent
                    1* Trailfire-bot/0.7.1 (Nutch; http://lucene.apache.org/nutch/bot.html; nutch-agent@lucene.apache.org)
                    1* T-Online Browser
                    1* SurveyBot/2.3 (Whois Source)
                    1* Snoopy v1.2
                    1* SiteSucker/2.1
                    1* Python-urllib/1.10
                    1* Pete-Spider Light/1.0
                    1* PCbot/3.0
                    1* panscient.com
                    1* owsBot/0.2 (owsBot; www.oneworldstreet.com; owsBot)
                    1* Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.4)
                    1* Mozilla/5.0
                    1* Mozilla/4.0 (compatible; Netcraft Web Server Survey)
                    1* Mozilla/3.0 (Compatible;Viking/1.91-399D) (Viking/1.91-399D) (prefetch)
                    1* Mozilla/3.0 (compatible; Indy Library)
                    1* MOMspider/2.00 MS Web Services Client
                    1* MoJoBot/0.1 libwww-perl/5.805
                    1* MJ12bot/v1.0.8 (http://majestic12.co.uk/bot.php?+)
                    1* Missigua Locator 1.9
                    1* Mein Browser und mein Betriebssystem
                    1* lwp-trivial/1.38
                    1* libwww-perl/5.65
                    1* libcurl-agent/1.0
                    1* Java/1.5.0_08
                    1* Java/1.5.0_06
                    1* Internet Browser
                    1* hq0nAjpp00vvrqnbsvgbgwngpytjghlnl
                    1* great-plains-web-spider/flatlandbot (Flatland Industries Web Spider; http://www.flatlandindustries.com/flatlandbot.php; jason@flatlandindustries.com)
                    1* favorstarbot/1.0 (+http://favorstar.com/bot.html)
                    1* curl/7.11.1 (i386-redhat-linux-gnu) libcurl/7.11.1 OpenSSL/0.9.7a ipv6 zlib/1.2.1.1
                    1* CFNetwork/129.21

                freundliche Grüße
                Ingo

                1. Hallo Ingo!

                  Ich habe eben durch ein versehentliches Klicken auf den Back-Button den Inhalt einer Antwort verloren, an der ich schon 20mn saß... ich kriege sie eh nicht mehr hin, ich versuche das nun kürzer zu fassen:

                  Mein Mini-webspace bei 1&1 hat ja leider kein PHP.

                  Vielleicht geht aber Perl? Frage mal Engin, was angeblich alles nicht geht ;)

                  Was für eine Sprache? Verstehe nichts ;)
                  brauchst Du auch nicht... Ist ein Basic-Dialekt für einen Compiler, der wirklich schnellen Maschinencode daraus erstellt.

                  Davon habe ich nun wirklich keine Ahung!

                  Ich habe mir übrigens Dein 100000-Zeilen Log mal vorgenommen...
                  Schade, dass Du die IPs so durcheinandergewürfelt hast und dadurch IP-Wechsel eines Besuchers nicht erkannt werden konnten. Wieso nur hast Du meinen Zugriffen über Arcor eine IP der Lithuanian Telecom gegeben? ;-)

                  Ich habe ein Skript drüber laufen lassen, der ein RegExp mit Funktion als Ersetzung hatte, etwa so:

                  while (<FILE>) {  
                    next if m#/logs#;  
                    
                    $_ =~ s|^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))|fake($2,$3,$4,$5)|e;  
                    
                    print OUT $_;  
                    $count++;  
                    last if $count == 3000;  
                  }
                  

                  [09:24:51] 301 /daten/86.html
                  [09:24:51] 301 /selfspezial/daten/86.html

                  ^^ Das kommt daher, dass ich ca. 2005 alle Visis gelöscht hatte. Dann habe ich auch die Subdomains eingeführt. Früher war der Aufruf ja:

                  http://www.atomic-eggs.com/selfspezial/daten/...

                  Also wird einmal auf selpezial.atomic-eggs.com/daten/... umgeleitet, und da sie gelöscht wurden, leite ich sie auf 410 ;). In der .htaccess kann man bei Redirect Gone keine RegExp verwenden (jedenfalls mir nicht bekannt), so habe ich einen RedirectMatch Permanent auf die 410. Mir ist bewußt, dass es so nicht ganz richtig ist, denn Suchbots sehen nur einen moved permanently und indexieren u.U. weiter unter dem selben Text. Allerdings kommen die meisten Anfragen zu den Visis vom hiesigen Archiv (meistens Kleinjungs Postings, der immer fleißig seine 101.html verlinkt hatte, aber auch die SELFHTML-Suche enthält noch einen Link zu Michael Schröpls Visitenkarten - die es auch nicht mehr gibt).

                  [09:24:52] 404 /favicon.ico

                  Ja, ich hatte mal ein Favicon auf SELFSPEZIAL, wird wohl beim Umziehen verloren gegangen sein ;)

                  Da schickst Du die armen User über zwei Zwischenstationen zu einer Gone-Seite, die Du mit 200 auslieferst...

                  s. oben...

                  Nett fand ich:
                  [Google Suchanfragen: 1009]
                    121* Geburtstagskarten

                  Ist immer ganz oben bei den Suchbegriffen... kaum zu glauben, wie oft dieses Wort oder Kombinationen davon (»was schreibe ich auf der Geburtstagskarte«, »Geburtagskarte zum X.«...) zu der SELFSPEZIAL-Seite mit den Community-Geburtstagen führt ;)

                  [ausgelieferte Seiten: 23202]  [PageImpressions: 23310]
                  1025* /

                  ^^ Hier werden alle Index-Seiten aller Subdomains als "/" angezeigt. Es gibt nur _eine_ access.log für alle 4 Domains und die paar Subdomains, die ich momentan verwalte. Daher ist mir das gester vorgestellte Skript für die tägliche Auswertung wichtig, da ich sehen, welche Domain der Besucher gesehen hat, wenn nur "/" steht (http://www.atomic-eggs.com/z_testdir/files/access_an.pl).

                  Aber Dich könnte meine Browserauswerung onteressieren:

                  Na klar. Hast du schon das Skript statfaker.pl daheim ausprobiert (Perl installation vorausgesetzt)? Ich verlinke hier die Auswertungen des Novembers für Browser (alle Hits), Browser (nur PageViews) und Betriebssysteme.

                  521* andere Robots (Anmerkung: Dein Lieblinksbot läuft bei mir nur hier unter Sonstige)

                  Meintest Du  »Microsoft URL Control«, der bei mir grundsätzlich 403 bekommt? ;)

                  9* CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler; http://www.cazoodle.com/cazoodlebot; cazoodlebot@cazoodle.com)

                  Boh, der nervt... er kann überhaupt nicht parsen, in seinen Requests sind HTML-Tags (http://example.org/datei.html<table><td>)... echt!

                  7* MSRBOT (http://research.microsoft.com/research/sv/msrbot/

                  und viele weiteren.... soviel habe ich in statfaker.pl nicht angegeben ;) Einige werte ich schon aus, der Rest läuft unter andere UAs. ;)

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Hi Patrick,

                    Mein Mini-webspace bei 1&1 hat ja leider kein PHP.

                    Vielleicht geht aber Perl? Frage mal Engin, was angeblich alles nicht geht ;)

                    Schrei´s doch noch lauter in die Botanik, die verantwortlichen haben dich noch nicht gehört.

                    :*SCNR*)
                    Grüße,
                    Engin
                     GYRO

                    --
                    "I would like to buy a hamburger"
                    Der Valligator
                    sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                  2. Hi Patrick,

                    Ich verlinke hier die Auswertungen des Novembers für Browser (alle Hits), Browser (nur PageViews) und Betriebssysteme.

                    atomic-eggs.com  -  Anzahl aller Hits: 293478
                    4 Domains von mir - Anzahl aller Hits: 1877781

                    Da ist ja ein Unterschied bemerkbar, aber

                    atomic-eggs.com  -  Anzahl aller PageViews: 71330
                    4 Domains von mir - Anzahl aller PageViews: 108868

                    Hier läuft irgendwas verkehrt, ich gehe aber mal davon aus, das es an mir liegt und nicht am Script. :)

                    atomic-eggs.com  -  Windows gesamt: 235486
                    4 Domains von mir - Windows gesamt: 1848207

                    Quelle

                    Grüße,
                    Engin
                     GYRO

                    --
                    "I would like to buy a hamburger"
                    Der Valligator
                    sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                    1. Hallo Engin!

                      atomic-eggs.com  -  Anzahl aller Hits: 293478
                      4 Domains von mir - Anzahl aller Hits: 1877781

                      Da ist ja ein Unterschied bemerkbar, aber

                      atomic-eggs.com  -  Anzahl aller PageViews: 71330
                      4 Domains von mir - Anzahl aller PageViews: 108868

                      Hier läuft irgendwas verkehrt, ich gehe aber mal davon aus, das es an mir liegt und nicht am Script. :)

                      Meinst Du damit, dass Du sechs mal mehr Hits hast als ich? Nun ja, die Clubseiten und klickand* machen ja schon allerhand.

                      Oder meinst Du den Unterschied zwischen »alle Hits« und PageViews? Der ist normal, schau mal. Bei jedem Request einer Seite werden Bilder, css-Dateien, js-Dateien womöglich auch, und und und: allein der Aufruf einer einzigen Seite erzeugt bei mir 23 Log-Einträge:

                      GET /wae/wae_0.shtml HTTP/1.0" 200 13173 www.atomic-eggs
                      GET /files/haupt.css HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /files/haupt.js HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /files/font.js HTTP/1.0" 304 - www.atomic-eggs.com "
                      GET /pics/open_wae.gif HTTP/1.0" 304 - www.atomic-eggs.c
                      GET /pics/logo.gif HTTP/1.0" 304 - www.atomic-eggs.com "
                      GET /pics/nav_cwi.gif HTTP/1.0" 304 - www.atomic-eggs.co
                      GET /pics/atomicegg.gif HTTP/1.0" 304 - www.atomic-eggs.
                      GET /pics/nav_scr.gif HTTP/1.0" 304 - www.atomic-eggs.co
                      GET /pics/help.gif HTTP/1.0" 304 - www.atomic-eggs.com "
                      GET /pics/nav_oae.gif HTTP/1.0" 304 - www.atomic-eggs.co
                      GET /pics/nav_ssp.gif HTTP/1.0" 304 - www.atomic-eggs.co
                      GET /pics/yellow.gif HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /pics/print.gif HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /pics/search.gif HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /pics/blue.gif HTTP/1.0" 304 - www.atomic-eggs.com "
                      GET /pics/down.gif HTTP/1.0" 304 - www.atomic-eggs.com "
                      GET /pics/red.gif HTTP/1.0" 304 - www.atomic-eggs.com "h
                      GET /pics/green.gif HTTP/1.0" 304 - www.atomic-eggs.com
                      GET /pics/rahmenmitte.gif HTTP/1.0" 304 - www.atomic-egg
                      GET /pics/rahmenunten.gif HTTP/1.0" 304 - www.atomic-egg
                      GET /pics/rahmenoben.gif HTTP/1.0" 304 - www.atomic-eggs
                      GET /favicon.ico HTTP/1.0" 200 3126 www.atomic-eggs.com

                      Bei der Auswertung nach PageViews werden alle die Zeile ignoriert:

                      #### Browserauswertung nach PageViews ####
                        if ($html) {
                          next if /((counter.cgi.+)|(.exe|.zip|.class|.au|/skype|ico|gif|css|js|jpg|robots.txt|png|cfg|/logs/?)).*\s*HTTP/1/i;
                          next if m{GET /\S*/*\S*/*?[a-z]=[a-z] HTTP/1.\d}i;
                          $pagecount++;
                          $count = $pagecount;
                        }
                        ##########################################

                      OK, »counter.cgi« und /skype ist spezifisch für meine Webseite, kann man aber im RegExp lassen, aber wer es will, kann es ja 'rausnehmen. Hier siehst Du, was alles ignoriert wird: alle Requests auf files mit den obigen Endungen. BTW werde ich die RegExps alle mal verfeinern, nur die nächste Zeit läuft da nicht viel mit proggen (Besuch der alten Dame *g*).

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
                      1. Hi Patrick,

                        Meinst Du damit, dass Du sechs mal mehr Hits hast als ich? Nun ja, die Clubseiten und klickand* machen ja schon allerhand.

                        Ich weiss, war ja auch nur Ironisch gemeint.  ;)

                        Auf klickandsurf sind auch die vielen imgs für diese hohe Quote von hits verantwortlich,
                        die ganzen Bilder, die beim :hovern geladen werden machen da schon sehr viel Traffic.

                        »» Oder meinst Du den Unterschied zwischen »alle Hits« und PageViews?

                        Das sah schon ein wenig komisch aus, wenn man es jetzt Prozentual sehen würde.

                        Hits bei mir mehr als das sechsfache, die Pageviews hingegen unterscheiden sich um grade mal 30-35%[1].
                        Das meinte ich mit, da läuft was schief.

                        Hättest du soviele hits wie ich, hättest du über 420.000 Pageviews, das hätte ich gerne bei mir so.  ;-)
                        Da könnte ich mich frühzeitig in den Affiliate-Ruhestand setzen.

                        Grüße,
                        Engin
                         GYRO

                        [1] oder so, bruchrechnen ist nicht so mein Ding! *g

                        --
                        "I would like to buy a hamburger"
                        Der Valligator
                        sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                        1. Hallo Engin!

                          Auf klickandsurf sind auch die vielen imgs für diese hohe Quote von hits verantwortlich,
                          die ganzen Bilder, die beim :hovern geladen werden machen da schon sehr viel Traffic.

                          Du kannst mit einem einfachen Skript fragen, wie viele Bilder, CSS, usw... für Einträge sorgen:

                            
                          use strict;  
                            
                          my $path = "Hier dein Pfad zur Logfile";  
                          my $count = 0;  
                            
                          open FILE, $path or die "BUUUUUH: $!";  
                          while (<FILE>) {  
                            $count++ if m#\.jpg|\.gif|\.png|\.css|\.js|\.class|\robots\.txt#;  # <-- erweiterbar um weitere Dateiendungen...  
                          }  
                            
                          print $count, $/;  
                          
                          

                          In konsole "perl" eingeben, Enter, Code pasten, [Strg]+Z, Enter, läuft...
                          Willst Du nur die Bildrequests haben, dann lass nur diese Dateiendungen im RegExp.

                          [1] oder so, bruchrechnen ist nicht so mein Ding! *g

                          Dafür hast Du ja Perl ;)

                          Viele Grüße aus Frankfurt/Main,
                          Patrick

                          --

                          _ - jenseits vom delirium - _
                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                          Nichts ist unmöglich? Doch!
                          Heute schon gegökt?
                          1. Hi Patrick,

                            Du kannst mit einem einfachen Skript fragen, wie viele Bilder, CSS, usw... für Einträge sorgen:

                            use strict;
                            my $path = "Hier dein Pfad zur Logfile";
                            my $count = 0;
                            open FILE, $path or die "BUUUUUH: $!";
                            while (<FILE>) {
                              $count++ if m#.jpg|.gif|.png|.css|.js|.class|\robots.txt#;  # <-- erweiterbar um weitere Dateiendungen...
                            }
                            print $count, $/;

                            
                            > In konsole "perl" eingeben, Enter, Code pasten, [Strg]+Z, Enter, läuft...  
                              
                            Ich krieg wie immer meine ganz persöhnliche und geliebte Standardausgabe,  
                              
                            BUUUUUH: Invalid argument at - line 6.  \*g  
                              
                            Das ist doch zum Mäuse melken, hab unter $path alles mögliche versucht, relativ, komplett, mit und ohne .txt, aber meine standardausgabe lässt nicht locker.  
                              
                            
                            > Willst Du nur die Bildrequests haben, dann lass nur diese Dateiendungen im RegExp.  
                              
                            Ja, ich will.  ;)  
                              
                            Grüße,  
                            Engin  
                             GYRO
                            
                            -- 
                            ["I would like to buy a hamburger"](http://www.youtube.com/watch?v=x8S7x_z1w1s)  
                              
                            ![](http://nimmet.de/nimmet-bilder/valigator.gif)[Der Valligator](http://old.atomic-eggs.com/old_forum/messages/237.html#a1)  
                            sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                            
                            1. Hallo Engin!

                              BUUUUUH: Invalid argument at - line 6.  *g

                              Zeile 6 ist die open-Anweisung. Würde bedeuten, dass er $path als »invalides Argument für open()« ansieht. Hast Du weiter oben unter $path den Pfad in Anführungseichen geschrieben?

                              So funzt(TM) es bei mirjedenfalls:

                              use strict;

                              my $path = "desktop/november_2007.txt";
                              my $count = 0;

                              open FILE, $path or die "BUUUUUH: $!";

                              Notfalls so:

                              open (FILE, "pfad/datei.txt") || die "Hammasjetzt?: $!";

                              Viele Grüße aus Frankfurt/Main,
                              Patrick

                              --

                              _ - jenseits vom delirium - _
                              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                              Nichts ist unmöglich? Doch!
                              Heute schon gegökt?
                              1. Hi Patrick,

                                So funzt(TM) es bei mirjedenfalls:

                                use strict;
                                my $path = "desktop/november_2007.txt";
                                my $count = 0;
                                open FILE, $path or die "BUUUUUH: $!";

                                Arghh, hatte das desktop/ vor den Dateinamen vergessen, wobei es doch auch bei
                                absoluten pfaden hätte gehen müssen!?

                                Aber was anderes, schau dir das mal Bitte an und sag mir, wo ich was falsch gemacht hab.

                                  
                                   $count++ if m#\.jpg|\.gif|\.png|\.css|\.js|\.class|\robots\.txt#;  #  
                                  
                                print $count, $/;^Z  
                                1685039  
                                ##################^^^^^^^ unverändert  
                                  
                                ####################################  
                                   $count++ if m#\.jpg|\.gif|\.png|\.css|\.js|\.class\.txt#;  #  
                                  
                                print $count, $/;^Z  
                                1685039  
                                ##################^^^^^^^ |\robots entfernt  
                                  
                                ####################################  
                                   $count++ if m#\.jpg|\.gif|\.png|\.css|\.js\.txt#;  #  
                                  
                                print $count, $/;^Z  
                                1648832  
                                ##################^^^^^^^ |\.class entfernt  -  was ist mit .class gemeint?  
                                  
                                ####################################  
                                   $count++ if m#\.jpg|\.gif|\.png|\.css\.txt#;  #  
                                  
                                print $count, $/;^Z  
                                1528712  
                                ##################^^^^^^^ |\.js entfernt  
                                  
                                ####################################  
                                   $count++ if m#\.jpg|\.gif|\.png\.txt#;  #  
                                  
                                print $count, $/;^Z  
                                1525971  
                                ##################^^^^^^^ |\.css entfernt  
                                  
                                ####################################  
                                   $count++ if m#\.jpg|\.gif\.png#;  #  
                                  
                                print $count, $/;^Z  
                                118060
                                

                                ##################^^^^^^^.txt entfernt und vor .png statt |\ nur \                                             ^^^^^^^^^^^^^^^^^^^^^^^

                                So richtig?

                                Grüße,
                                Engin
                                 GYRO

                                --
                                "I would like to buy a hamburger"
                                Der Valligator
                                sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                                1. Hallo Engin!

                                  Arghh, hatte das desktop/ vor den Dateinamen vergessen, wobei es doch auch bei

                                  Perl irrt sich nie. Der User tut's ;)

                                  absoluten pfaden hätte gehen müssen!?

                                  Ach, _das_ hattest Du versucht? Die kann man angeben, um in ein anderes Verzeichnis zu "gehen". z.B.

                                  chdir "K:\www\myweb\mystats";
                                  open FILE, "stat.txt";

                                  Sonst geht Perl immer vom Arbeitsverzeichnis aus, so dass auch solche Angaben möglich sind:

                                  open FILE, "../eineebenehoeher/stat.txt";

                                  Das Arbeitsverzeichnis ist immer das, von wo aus Perl aufgerufen wird. Auf dem Webspace ist es dann in der Regel das cgi-bin. Das kriegst du immer ausgegeben mit:

                                  use strict;
                                  use Cwd;
                                  print cwd();

                                  [code lang=perl]
                                     $count++ if m#.jpg|.gif|.png|.css|.js|.class|\robots.txt#;  #

                                  print $count, $/;^Z
                                  1685039
                                  ##################^^^^^^^ unverändert

                                  ####################################
                                     $count++ if m#.jpg|.gif|.png|.css|.js|.class.txt#;  #

                                  print $count, $/;^Z
                                  1685039
                                  ##################^^^^^^^ |\robots entfernt

                                  Das war hier ein Tippfehler von mir: das Slash vor'm »r« von »robots« muss weg:

                                  m#.jpg|.gif|.png|.css|.js|.class|robots.txt#

                                  ####################################
                                     $count++ if m#.jpg|.gif|.png|.css|.js.txt#;  #

                                  print $count, $/;^Z
                                  1648832
                                  ##################^^^^^^^ |.class entfernt  -  was ist mit .class gemeint?

                                  Ich habe zwei oder drei Java-Applets auf old.atomic-eggs.com - da werden die sogenannten Java-Klassen geladen.

                                  Deine anderen »Enfernungen« sind falsch, weil das | für »oder« fehlt. Der Ausdruck liest sich wie folgt:

                                  $count++ if if m#.jpg|.gif|.png|.css|.js|.txt#;

                                  Erhöhe einmal den Wert von $count (um 1), wenn in der Zeile .jpg ODER .gif ODER .png ODER .css ODER .js ODER .txt vorkommt. Somit werden nur Zeilen gezählt, die eine dieser Dateiendungen in der ganzen Zeile enthalten. Der Punkt hat in RegExp eine Bedeutung, weswegen er maskiert werden muss. Das | enspricht hier »ODER«.

                                  Wenn Du | enfernst wie oben, heißt es:

                                  Erhöhe den Wert von $count wenn (...) ODER die Zeichekette ».js.txt« (in dieser Reihenfolge) in der Zeile vorkommt (was eher unwahrscheinlich ist) ;)

                                  ##################^^^^^^^.txt entfernt und vor .png statt |\ nur \ So richtig?

                                  s. oben ;)

                                  Viele Grüße aus Frankfurt/Main,
                                  Patrick

                                  --

                                  _ - jenseits vom delirium - _
                                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                  Nichts ist unmöglich? Doch!
                                  Heute schon gegökt?
                                  1. Hi Patrick,

                                    absoluten pfaden hätte gehen müssen!?

                                    Ach, _das_ hattest Du versucht? Die kann man angeben, um in ein anderes Verzeichnis zu "gehen". z.B.

                                    Man könnte aber doch auch in das Verzeichnis zugreifen, wo man grade ist,

                                    C:\Dokumente und Einstellungen\USER\Desktop\alledomains_2007.txt

                                    so ging es bei mir nicht.

                                    Deine anderen »Enfernungen« sind falsch, weil das | für »oder« fehlt. Der Ausdruck liest sich wie folgt:

                                    Der Punkt hat in RegExp eine Bedeutung, weswegen er maskiert werden muss. Das | enspricht hier »ODER«.

                                    Stimmt, hatte mich schon gewundert, warum die Bilder "nur"

                                    print $count, $/;^Z  
                                    118060
                                    

                                    haben, richtig ist es

                                    print $count, $/;^Z  
                                    1528712
                                    

                                    Viel Spass im "Urlaub".  :)

                                    Grüße,
                                    Engin
                                     GYRO

                                    --
                                    "I would like to buy a hamburger"
                                    Der Valligator
                                    sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:} va:? js:| de:µ zu:] fl:| ss:{ ls:?
                  3. Hi,

                    Also wird einmal auf selpezial.atomic-eggs.com/daten/... umgeleitet, und da sie gelöscht wurden, leite ich sie auf 410 ;). In der .htaccess kann man bei Redirect Gone keine RegExp verwenden (jedenfalls mir nicht bekannt), so habe ich einen RedirectMatch Permanent auf die 410. Mir ist bewußt, dass es so nicht ganz richtig ist,

                    und warum leitest Du dann nicht wenigstens direkt auf ein Script, dass die Info mit Statuscode 410 ausliefert?
                    Aber über die .htaccess wäre es viel einfacher und konsequenter:

                    Redirect Gone /daten/86.html
                    Redirect Gone /selfspezial/daten/86.html
                    ErrorDocument 410 /error410.html

                    Na klar. Hast du schon das Skript statfaker.pl daheim ausprobiert (Perl installation vorausgesetzt)?

                    Nein.

                    521* andere Robots (Anmerkung: Dein Lieblinksbot läuft bei mir nur hier unter Sonstige)

                    Meintest Du  »Microsoft URL Control«, der bei mir grundsätzlich 403 bekommt? ;)

                    Ich dachte da an Deinen VoilaBot.

                    freundliche Grüße
                    Ingo

                    1. Hallo Ingo!

                      und warum leitest Du dann nicht wenigstens direkt auf ein Script, dass die Info mit Statuscode 410 ausliefert?

                      Das ist ein Gedanke, danke!

                      Aber über die .htaccess wäre es viel einfacher und konsequenter:
                      Redirect Gone /daten/86.html
                      Redirect Gone /selfspezial/daten/86.html

                      Ja aber es gibt ca. 220 gelöschte Visis und ca. 2000 gelöschte alte SCB-Board-Beiträge, für jede Datei ein Eintrag?... Das mit dem Skript dagegen ist machbar.

                      Meintest Du  »Microsoft URL Control«, der bei mir grundsätzlich 403 bekommt? ;)
                      Ich dachte da an Deinen VoilaBot.

                      Ach so, ja. Das ist die Suchmaschine von Orange (France Telecom), und die wird vornehmlich französischsprachige Seiten abgrasen, denke ich mal. Wie gesagt, der Bot kam sicher über das frz. SELFHTML Forum »zu mir«.

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
        2. Re Ingo!

          Ich habe noch ein Skript, der mir die von 1&1 bereitgestellten, täglichen Logs nach UA und IP gruppiert auswertet, da schaue ich mehrmals am Tag 'rein und kann so sehen, wie lange ein Besucher verweilt, was er sich angeschaut hat, etc...

          Das sieht übrigens so aus:

          http://www.atomic-eggs.com/z_testdir/files/access_an.pl.

          Hier mit einer auf 3000 Zeilen gekürzten und mit gefakten Ips (vorher ein Skript drüber laufen lassen) bestückten Logfile.

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?