Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

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