Verwerken van AWstats bestanden

Armijn Hemel, 28 juli 2010, 6838 views.

AWstats is een populair stuk software om logbestanden van webservers te analyzeren. De bestanden van AWstats zitten boordevol interessante informatie, waar je leuke dingen mee kan doen.

Tags: , , ,

AWstats is een programma waarmee je interessante informatie uit logbestanden van Apache kan halen. Het is erg efficient in het verwerken van grote logbestanden. De data wordt door AWstats weggeschreven in een simpel formaat waarin een schat aan informatie over je website staat. Omdat AWstats jarenlang is doorontwikkeld is het erg snel en laten we het graag het zware tilwerk doen, waarna we de informatie die AWstats heeft verzameld makkelijk kunnen gebruiken. De informatie die AWstats uit de logbestanden haalt varieert van de gebruikte bandbreedte, de hoeveelheid hits op websites tot aan de zoekstrings die gebruikt worden in zoekmachines.

AWstats schrijft deze informatie weg in een apart bestand, typisch één per maand per domein. De plek op het bsetandsysteem kan verschillen, maar /var/www/awstats/ is vrij gebruikelijk. In het begin van het bestand staat een sectie met een lijst met daarin voor elke categorie waarover AWstats rapporteert de byte offsets binnen het bestand. Deze offset wijst naar de plek binnen het bestand waar de uitgebreide informatie gevonden kan worden, bijvoorbeeld:

POS_VISITOR 52400

Dit wiil zeggen dat het begin van de lijst met alle bezoeken gevonden kan worden op byte offset 52400.

Eén van de dingen die AWstats kan meten is hoeveel bytes er door Apache gestuurd wordt. Dit is voor ons belangrijke informatie, omdat we het gebruiken om in de gaten te houden hoe de bandbreedte op onze servers gebruikt wordt. Deze informatie schrijft AWstats weg in de sectie met dagelijkse rapporten. Door de juiste offset te vinden en binnen het bestand naar die offset te springen kunnen we deze data makkelijk ontsluiten.

Op deze positie staat een 'header', met daarin gespecifieerd voor hoeveel dagen er logs zijn:

BEGIN_DAY 19

Daarna volgt er per dag een regel met data (in dit geval dus 19). Een regel data ziet er zo uit:

20100501 768 1396 8933719 126

Het eerste nummer is overduidelijk de datum. De overige nummers staan voor de hoeveelheid pagina's die uitgeserveerd zijn, de hoeveelheid hits, de bandbreedte in bytes en het aantal unieke bezoekers.

Als je een script zou hebben om de bandbreedte van alle dagen in een maand zou meten (waarbij er één bestand per maand is), dan zouden we het volgende doen:

  1. zoek de offset in het bestand
  2. bepaal voor hoeveel dagen er data is
  3. zoek voor elke dag de juiste data op en tel de resultaten bij elkaar op

In Python kan je dat zo doen:

#! /usr/bin/python
 
import sys
 
total = 0
 
def processFile(filename):
        tmptotal = 0
        pos = 0
        line = filename.readline()
        while line:
                try:
                        if line.split()[0] == "POS_DAY":
                                pos = line.split()[1]
                                break
                except: pass
                line = filename.readline()
 
        pos = int(pos)
        filename.seek(pos)
        days = int(filename.readline().split()[1])
 
        for i in range(1,days+1):
                tmptotal += int(filename.readline().split()[3])
        return tmptotal
 
for i in sys.argv[1:]:
        awfile = open(i)
        total += processFile(awfile)
 
print total

Je kan dit script uitvoeren met een commando zoals dit (waarbij het bovenstaande script is weggeschreven naar awstats.py):

$ awstats.py /path/to/awstatsfile
Creative Commons License Op dit werk is een Creative Commons Licentie van toepassing.
Social networking: Tweet dit artikel op Twitter Geef dit artikel door op LinkedIn Bookmark dit artikel op Google Bookmark dit artikel op Yahoo! Bookmark dit artikel op Technorati Bookmark dit artikel op Delicious Deel dit artikel op Facebook Digg dit artikel op Digg Zend dit artikel naar to Reddit Geef dit artikel een duim omhoog op StumbleUpon Zend dit artikel naar Furl

Talkback

reageer op dit artikel