Erzeugung strukturierter Logdaten

Umwandlung eines Zeitstempels

Ziel ist es zunächst, einen Zeitstempel, der als Zeichenkette dargestellt ist, in eine Tupelform zu bringen. Die Funktion strukturierterZeitstempel soll genau dies leisten.

<Black-Box-Diagramm><Funktionsname>strukturierterZeitstempel</Funktionsname><Übergaben><Übergabe><Wert>'[24/Jul/2012:12:44:21 +0200]'</Wert><Variable>zeichenkette</Variable><Typ>str</Typ></Übergabe></Übergaben><Rückgabe><Typ>tupel</Typ><Wert>((24, 'Jul', 2012), (12, 44, 21), ('+', 2, 0))</Wert></Rückgabe></Black-Box-Diagramm>

Aufgabe 1

Ergänze die fehlenden Teile. Überprüfe, ob der integrierte Testfall korrekt verarbeitet wird.

def strukturierterZeitstempel(zeichenkette):

    """
    >>> strukturierterZeitstempel('[24/Jul/2012:12:44:21 +0200]')
    ((24, 'Jul', 2012), (12, 44, 21), ('+', 2, 0))
    """
    
    # Datum
    tag = int(zeichenkette[1:3])
    monat = zeichenkette[4:7]
    jahr = int(zeichenkette[8:12])
    # Uhrzeit
    stunde = ...
    minute = ...
    sekunde = ...
    # Zeitverschiebung
    vorzeichenZeitverschiebung = ...
    stundenZeitverschiebung = ...
    minutenZeitverschiebung = ...
    # Datentupel
    datum = (tag, monat, jahr)
    uhrzeit = ...
    zeitverschiebung = ...
    ergebnis = ...
    return ergebnis

if __name__ == "__main__":
    from doctest import testmod
    testmod()

Umwandlung eines Logeintrags

Die Umwandlung eines kompletten Logeintrags ist etwas komplizierter, da man die Anfangs- und Endpositionen der jeweiligen Bestandteile suchen muss. Wir geben ihn daher hier komplett vor.

def strukturierterLogeintrag(logeintrag):

    """
    >>> strukturierterLogeintrag('    91.11.215.221 - - [28/Dec/2015:12:27:50 +0100] "GET /assets/js/jquery.min.js HTTP/1.1" 200 33633 "http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/beispiel_wegberechnungen" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"')
    ('91.11.215.221', '-', '-', ((28, 'Dec', 2015), (12, 27, 50), ('+', 1, 0)), 'GET /assets/js/jquery.min.js HTTP/1.1', 200, 33633, 'http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/beispiel_wegberechnungen', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0')
    """

    # IP-Adresse
    posAnfangIPAdresse = 0
    while posAnfangIPAdresse < len(logeintrag) and logeintrag[posAnfangIPAdresse] == ' ':
        posAnfangIPAdresse = posAnfangIPAdresse + 1
    posEndeIPAdresse = logeintrag.find(' ', posAnfangIPAdresse)
    ipadresse = logeintrag[posAnfangIPAdresse:posEndeIPAdresse]
    # Benutzername
    posAnfangName = posEndeIPAdresse + 1
    posEndeName = logeintrag.find(' ', posAnfangName)
    nutzername = logeintrag[posAnfangName:posEndeName]
    # Passwort
    posAnfangPasswort = posEndeName + 1
    posEndePasswort = logeintrag.find(' ', posAnfangPasswort)
    passwort = logeintrag[posAnfangPasswort:posEndePasswort]
    # Zeitstempel
    posAnfangZeitstempel = posEndePasswort + 1
    posEndeZeitstempel = logeintrag.find(']', posAnfangZeitstempel) + 1
    zeitstempelAlsZeichenkette = logeintrag[posAnfangZeitstempel:posEndeZeitstempel]
    zeitstempel = strukturierterZeitstempel(zeitstempelAlsZeichenkette)
    # GET-Anfrage
    """
    normal:
    "GET /algorithmen HTTP/1.1"
    problematisch:
    "GET /\" + pkBaseURL + \"piwik.js HTTP/1.1"
    ebenso:
    "HEAD /wp-trackback.php HTTP/"
    """
    posAnfangGet = posEndeZeitstempel + 2
    posHTTP = logeintrag.find('HTTP', posAnfangGet)
    posEndeGet = logeintrag.find('"', posHTTP+1)
    getanfrage = logeintrag[posAnfangGet:posEndeGet]
    # Ok-Code
    posAnfangOk = posEndeGet + 2
    posEndeOk = logeintrag.find(' ', posAnfangOk)
    okcode = int(logeintrag[posAnfangOk:posEndeOk])
    # Anzahl der Bytes
    posAnfangBytes = posEndeOk + 1
    posEndeBytes = logeintrag.find(' ', posAnfangBytes)
    anzahlbytes = int(logeintrag[posAnfangBytes:posEndeBytes])
    # URI der Internetseite
    posAnfangURI = posEndeBytes + 2
    posEndeURI = logeintrag.find('"', posAnfangURI)
    uri = logeintrag[posAnfangURI:posEndeURI]
    # Browser und Betriebssystem
    posAnfangWomit = posEndeURI + 3
    posEndeWomit = logeintrag.find('"', posAnfangWomit)
    womit = logeintrag[posAnfangWomit:posEndeWomit]
    # Datentupel erstellen
    ergebnis = (ipadresse, nutzername, passwort, zeitstempel, getanfrage, okcode, anzahlbytes, uri, womit)
    return ergebnis

if __name__ == "__main__":
    from doctest import testmod
    testmod()

Aufgabe 2

Teste auch diese Funktion. Analysiere den Quelltext und beschreibe die Vorgehensweise bei der Umwandlung.

X

Fehler melden

X

Suche