i

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):
"""
&gt;&gt;&gt; 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):
"""
&gt;&gt;&gt; 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 &lt; 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.

Suche

v
2.5.1.7.3
www.inf-schule.de/programmierung/funktional/projekte/logdateien/erzeugung

Rückmeldung geben