AWStats-Statistiken statisch generieren
- October 13th, 2008
- Posted in HTML . Linux
- By Mr. Nerd
- Write comment
Das Logdateien-Analyseprogramm AWStats eignet sich hervorragend zur Auswertung einer Vielzahl von Logs, insbesondere für Access-Logs eines Webservers.
Im Normalfall werden die Statistiken direkt von AWStats als CGI-Skript verfügbar gemacht. Wem das aber zu unsicher ist (weil direkter Zugriff auf das CGI-Skript bestehen muss) oder die Performance wichtig ist (etwa wenn viele Kunden gleichzeitig auf ihre Statistiken zugreifen wollen) kann die Statistiken auch per CronJob generieren und statisch ausliefern.
Um das Ganze etwas zu automatisieren habe ich eine Kombination aus Python-Skript (zum automatischen Auswerten) und einem PHP-Skript (zur sortierten Ausgabe) erstellt.
Wer nur die Statistiken des aktuellen Monats auswerten kann benötigt das PHP-Skript nicht und kann direkt auf die vom Python-Skript erzeugten Statistiken zugreifen.
Vorraussetzungen
Wir gehen von einem Webserver aus, der einem User die Statistiken unter /srv/www/htdocs/stats/DomainName verfügbar machen will.
Das AWStats-Programm inklusive dem Helfer-Programm awstats_buildstaticpages.pl muss natürlich installiert werden. Entweder als distributionseigenes Paket (zu Empfehlen wegen automatischen Updates) oder von der AWStats-Homepage.
Ausserdem muss bereits eine Konfiguration für die jeweilige Domain in /etc/awstats vorhanden sein mit Namen awstats.DomainName.conf. Hinweise zum Erstellen der AWStats-Konfiguration erhält man auf der AWStats-Homepage.
Hinweis: Für alle Seiten, die man statisch generieren will (also bspw. Keywords) muss natürlich der entsprechende Eintrag gesetzt sein (hier also ShowKeywordsStats=1).
Python-Skript
Das Python-Skript erstellt per Cron-Job jeweils die Statistiken des aktuellen Monats für eine Domain. Zur Zeit ist es noch of eine Domain ausgelegt, wird aber in Zukunft erweitert.
#!/usr/bin/python
import time
import datetime
import os
#Basis-Pfad wo die Statistiken gespeichert werden soll
baseDir="/srv/www/htdocs/stats/DomainName"
#Standard-Pfad unter Suse, an Distribution anpassen
awStatsCmd="/srv/www/cgi-bin/awstats.pl"
#Das Helfer-Programm muss evtl. nachinstalliert werden
awStatsStaticCmd="/usr/sbin/awstats_buildstaticpages.pl"
#Name der Konfigurationsdatei, für awstats.DomainName.conf also:
cfgName="DomainName"
#aktuelles Datum (Jahr,Monat und Tag)
year,month,day=str(datetime.date.today()).split("-")
#Gibt es schon Verzeichnisse für dieses Jahr und diesen Monat?
#Jahr:
if os.path.isdir(baseDir+year)==False:
os.makedirs(baseDir+year)
#Monat:
if os.path.isdir(baseDir+year+"/"+month)==False:
os.makedirs(baseDir+year+"/"+month)
#Aktualisiere die Statistiken für das aktuelle Jahr und den Monat
awCmd=awStatsStaticCmd+" -awstatsprog="+awStatsCmd+" -config="+cfgName+" -update -output -staticlinks -dir="+baseDir+year+"/"+month+"/ -year="+year+" -month="+month
result=os.system(awCmd)
#Umbenennung der Index-Datei: Anpassen falls nicht xml benutzt wird!
result=os.system("/bin/mv "+baseDir+year+"/"+month+"/awstats."+cfgName+".xml "+baseDir+year+"/"+month+"/index.html")
#Ausgabe: Falls nicht gewünscht einfach weglassen
print result
Das Skript generiert für den aktuellen Monat (im aktuellen Jahr) die Statistiken. Dabei legt es, sofern noch nicht vorhanden, die Verzeichnisse für Jahr und Monat an. Nach Aufruf liegen die Statistiken als (X)HTML-Dateien im entsprechenden Verzeichnis vor.
Für Januar 1984 lautet das Verzeichnis in diesem Fall: /srv/www/htdocs/stats/DomainName/1984/01/
PHP-Skript
Damit man eine komfortable Index-Datei erhält, die man nicht für jeden Monat und jedes Jahr aktualisiern muss übernimmt ein kleines PHP-Skript die Anzeige. Dabei wird dem Skript mitgeteilt, zu welchem Zeitpunkt erstmalig Statistiken vorlagen. Daraus berechnet das Skript dann alle Kombinationen bis heute. Wer es gerne noch einfach mag lässt das Skript das Stats-Verzeichnis nach Ordnern und Unterordnern durchsuchen. Das kostet aber mehr Performance…
<html>
<head>
<title>Navigation für Statistiken</title>
</head>
<body>
<div style="width: 200px; height: 100%; float: left; clear: both; background-color: #000000; color: #FFFFFF;">
<?php
$config=array();
//Name der Konfiguration
$config['name']='9null.de';
//Wann das erste Mal gelaufen?
$config['firstRun']=array(1,2008);
//Alle verfügbaren Monate in URL-Form
$months=array("01","02","03","04","05","06","07","08","09","10","11","12");
//Alle Jahre durchgehen
$years=array();
for($year=$config['firstRun'][1];$year<=date("Y");$year++){
//Monate für das Jahr anzeigen
echo "<h3>$year</h3>\n<ul>";
for($month=(($year==$config['firstRun'][1])?$config['firstRun'][0]:1);$month<=(($year==date("Y"))?date("m"):12);$month++)
echo "<li><a href=\"./$year/".$months[$month-1]."/index.html\" target=\"conFrame\">".$month.'-'.$year."</a></li>\n";
//Listenende & Spacer
echo "</ul><br /><br />\n\n";
}
//Aktuellen Monat als ersten anzeigen
$showCurrent="./".date("Y")."/".date("m")."/index.html";
?>
</div>
<iframe name="conFrame" style="position: absolute; top: 0px; left: 205px;height: 100%; min-width: 800px; width: 80%;float: left; clear: none;" src="<?php echo $showCurrent; ?>" />
</body></html>
Schlußwort
Mit der gegebenen Kombination ist es sehr einfach möglich, AWStats-Statistiken einer Domain statisch verfügbar machen. Ein CronJob auf das Python-Script zu einem günstigen Zeitpunkt (etwa jede Nacht) sorgt für regelmäßige Akualisierung. Von Sicherheitslücken im CGI von AWStats ist man (mal ausgenommen von Lücken beim Log-Parsing) befreit und auch Performace-Einbußen durch die CGI-Nutzung sind kein Problem mehr.
Als Erweiterungen bleiben also noch:
- Eine vernünftige Konfiguration für mehrere Domains.
- Evtl. das Speichern der statischen Logs in einer Datenbank…