Cronjob/bashscript: Logfile bearbeitung / AWStats

pilgrims

New Member
Hallo,

ich möchte eine Reihe von manuellen Schritten auf der Shell automatisiert ablaufen lassen.
Da ich aber keine Ahnung von bashscript-Erstellung habe, vielleicht kann mir jemand weiterhelfen.


Folgende Situation:

Lenny-Server mit einem Apache2-Webserver.
Ein vhost mit einer Domain (xyz.de) ist dort eingerichtet.
In dem vhost-Webverzeichnis liegen ca. 20 Verzeichnisse (VerzeichnisnameA, VerzeichnisnameB, ...) auf einer Ebene mit eigenständigen Inhalten, die aber nur mit der URL der Domain aufgerufen werden können (Beispiel xyz.de/VerzeichnisnameA/ )

Es wird ein Apache-Logfile für den vhost angelegt (xyz.de.access).
AWStats ist manuell eingerichtet worden und nicht als Systeminstallation per Deb-Paket.

Problem:

Es soll für die Zugriffe auf jedes gewünschte Verzeichnis eine eigene AWStats-Statistik geführt werden.


Lösungsansatz, den ich mir vorstelle, nehme aber auch andere Vorschläge an:

Ich brauche offenbar einen Cronjob, der z.B. 1x pro Woche läuft und folgende Dinge erledigt, die ich sonst per Hand machen würde:

  1. prüfe ob Logfile-Kopie (zur Verarbeitung) vorhanden ist. Wenn keine Logfile-Kopie vorhanden ist, dann
    • mv xyz.de.access xyz.de.access4awstats
    • touch xyz.de.access
  2. lösche vorhandene Verzeichnislogfiles:
    rm verzeichnisname??.log
  3. erstelle vorhandene Verzeicnislogfiles auf Logfile-Kopie:
    grep verzeichnisnameA xyz.de.access4awstats > verzeichnisnameA.log
    grep verzeichnisnameB xyz.de.access4awstats > verzeichnisnameB.log
    grep verzeichnisnameC xyz.de.access4awstats > verzeichnisnameC.log
    usw.
  4. führe die einzelnen awstats-cgi's aus, in denen die Verzeichnislogfiles definiert wurden:
    perl /www/xyz.de/webseiten/awstats/cgi-bin/awstats_updateall.pl now



Nachtrag:
Ich bin auch bereit "kleines Geld" für die Lösung meines beschriebenen Problems zu bezahlen. Entsprechende Angebote bitte per persönlicher Nachricht.
 
Last edited by a moderator:
Mit einem entsprechenden Skript koenntest du fuer jede Zeile den Ordner ueberpruefen und muesstest somit die Logfile nur 1x durchlesen was CPU und Disk-IO spart.
 
Ich wuerde es auf PHP basieren und mit einem Kompiler beschleunigen
(Oder zumindest PHP5.3 nehmen da der Garbage-Kollektor bedeutend Fortschritte gemacht hat)

Poste mal paar Log-Zeilen bitte, ich bastel dann schnell was ;)
 
Ein paar Zeilen apache2-combined-logfile? Na gut, hier sind ein paar anonymisierte Zeilen:


Code:
85.2.248.80 - - [28/Jun/2010:12:32:05 +0200] "GET /naumburg/pics/uploads/Sonntag.jpg HTTP/1.1" 200 98004 "http://www.xyz.de/naumburg/index.php" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; de-de) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16"
85.2.248.80 - - [28/Jun/2010:12:32:08 +0200] "GET /naumburg/index.php HTTP/1.1" 200 25641 "http://www.xzy.de/naumburg/index.php" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; de-de) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16"
85.2.248.80 - - [28/Jun/2010:12:33:30 +0200] "GET /naumburg/index.php?id=99 HTTP/1.1" 200 27078 "http://www.xyz.de/naumburg/index.php" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; de-de) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16"
85.2.248.80 - - [28/Jun/2010:12:33:30 +0200] "GET /naumburg/js/startani.js HTTP/1.1" 302 383 "http://www.xyz.de/naumburg/index.php?id=99" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_3 like Mac OS X; de-de) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7E18 Safari/528.16"
207.42.12.210 - - [28/Jun/2010:12:34:15 +0200] "GET /kassel/index.php HTTP/1.1" 200 98004 "http://www.xyz.de/kassel/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
207.42.12.210 - - [28/Jun/2010:12:34:18 +0200] "GET /kassel/index.php HTTP/1.1" 200 25641 "http://www.xzy.de/kassel/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
207.42.12.210 - - [28/Jun/2010:12:34:30 +0200] "GET /kassel/index.php?id=99 HTTP/1.1" 200 27078 "http://www.xyz.de/kassel/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
207.42.12.210 - - [28/Jun/2010:12:35:10 +0200] "GET /kassel/js/startani.js HTTP/1.1" 302 383 "http://www.xyz.de/kassel/index.php?id=99" "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
188.191.128.231 - - [28/Jun/2010:14:50:33 +0200] "GET /hamburg/index.php HTTP/1.1" 200 228 "http://www.xyz.de/hamburg/index.php" "Opera/9.80 (Windows NT 5.1; U; de) Presto/2.5.24 Version/10.54"
188.191.128.231 - - [28/Jun/2010:14:50:33 +0200] "GET /hamburg/index.php HTTP/1.1" 200 9662 "http://www.xyz.de/hamburg/index.php" "Opera/9.80 (Windows NT 5.1; U; de) Presto/2.5.24 Version/10.54"
188.191.128.231 - - [28/Jun/2010:14:50:33 +0200] "GET /hamburg/pic/bg_pfeile.gif HTTP/1.1" 200 3735 "http://www.xyz.de/hamburg/index.php" "Opera/9.80 (Windows NT 5.1; U; de) Presto/2.5.24 Version/10.54"
 
Last edited by a moderator:
PHP:
<?php
//CONFIG STARTS HERE

//Path to your combined log file (_ONLY_ one domain!)
$LOG_FILE = '/var/log/apache2/access_domain.tld.log';
//Where to put log files (FOLDER!)
$LOG_TO = '/root/log_extracted/';
//Which folders to extract. Don't forget the trailing slash or it will match folders starting with that name! 
///hamburg would also match /hamburg_umfeld
$FOLDERS = array('/naumburg/','/hamburg/','/kassel/');

//CONFIG ENDS HERE

$log_to = array();

$fp = fopen($LOG_FILE,'r') OR die("Couldn't open logfile: ".$LOG_FILE);
//Scan log
while(!feof($fp)) {
   $line = fgets($fp);
   preg_match("/GET ((?:\\/[\\w\\.\\-]+)+)/",$text,$matches); //Extract unix path
  if(@count($matches) != 2 OR empty($matches['1'])) continue; //Not a log-line
  foreach($FOLDERS as $folder) {
     if(strpos($matches['1'],$folder) !== 0) continue; //Not matched. Note: strpos is supposedly faster than regexp
     //Check if logfile is already open
     if(!isset($log_to[$folder])) $log_to[$folder] = @fopen($LOG_TO.$folder.'.log','a');
     if(!$log_to[$folder])) {
         echo "Could not open log: ".$folder.PHP_EOL;
         continue;
     }
     //Write
     fwrite($log_to[$folder],PHP_EOL.$line);
  }  
}
?>
Ungetestet, hoffentlich habe ich nicht zuviele Fehler gebastelt :P

[EDIT]
Das ganze sollte aus performance-Gruenden kompiliert werden, ich empfehle desbezueglich hPHP (Hip-Hop for PHP) oder Roadsend
 
Last edited by a moderator:
Back
Top