Logfiles auswerten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
janni80

Dienstag 7. Juni 2005, 10:50

Hallo zusammen,

ich habe folgenden Code und möchte ein Logfile auswerten. Was ich bisher hinbekommen habe ist, dass wenn in einer Zeile der Wert "1020" vorkommt, er es in das outfile kopiert, wie kann ich es aber in Python schaffen, das ich eine Auswertung bekomme, d.h. ich will nicht statisch den Wert "1020" eingeben, denn ich habe etwa 100 solcher Einträge, sondern das dies dynamisch funktioniert, geht das mit einer Liste oder? Wäre um Feedback dankbar.


Hier ein Auszug aus dem Logfile:
  • 2005-2-6 0:0:6 GMT 192.168.40.15 samsungproxye.sdsg.de - SAMSUNGEXCGW1 106.101.1.108 smkim@samsung.de 1020 dr$j51$6mx$uu2h@c6rg5g9 1 0 2870 1

Code: Alles auswählen

infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\20050221.log", 'r')
outfile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog.log", 'w')

for line in infile:
    if "1020" in line:
        outfile.write(line)

infile.close()
outfile.close()
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 11:37

Pack doch deine Nummern in einer Liste und beim einlesen der Log verteilst du es in ein Dict.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Dienstag 7. Juni 2005, 11:44

Hi Jens,

wie funktioniert sowas bzw. wie muss ich da vorgehen, hast du nen tip für mich?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 11:50

ungefähr so:

Code: Alles auswählen

infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\20050221.log", 'r')

nummern = ["1020","1021","222"]

result = {}
for line in infile:
    for nummer in nummern:
        if nummer in line:
            result[nummer] = line

infile.close()

print result

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Dienstag 7. Juni 2005, 12:06

Hi Jens,

deine Lösung ist ok, aber ich wollte ja nicht ein Dictionary erstellen, denn da müsste ich die ganzen Einträge(etwa 100) manuell eingeben, kann man in python das nicht dynamisch machen???
janni80

Dienstag 7. Juni 2005, 12:17

Hi Jens,

ich bins nochmal, hab mich vorhin falsch ausgedruckt, also wenn der Wert "1020" gefunden wird, möchte ich dann für jeden Server(in meinem Fall samsungproxye.sdsg.de) eine Auswertung, aber dies soll dynamisch geschehn, sprich heute ist es der samsungproxy1, morgen vielleicht samsungproxy2 usw.
verstehst du mein Problem?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 12:31

janni80 hat geschrieben:verstehst du mein Problem?
Ehrlich gesagt nicht wirklich ;)

Du kannst doch die nummern-Liste "dynamisch" erzeugen... Ich weiß ja nicht woher diese kommen sollen/können...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Dienstag 7. Juni 2005, 12:39

Hi Jens,

sorry wenn ich mich nicht richtig ausdrücke, ich probiere es nochmal. Da mein Logfile recht gross ist(etwa 40MB) möchte ich jede Zeile nach dem Wert "1020" durchsuchen, soweit sind wir ja schon:-)
Jetzt musst du dir vorstellen in der jeweils selektierten Zeile stehen noch andere wichtige Informationen. Ich möchte jetzt z. B. das in jeder Zeile nach Benutzernamen durchsuchen sprich, wenn z.B. der Benutzername "gast" vorkommt, soll er mir alle Zeilen mit dem Benutzernamen "gast" ausgeben. Der Benutzername steht immer an der dritten Stelle im Array. Was ich nun will ist, dass das Programm dynamisch die Benutzernamen selektiert ohne das ich sie in ein Dictionary erst einpflegen muss. Ich denke das muss irgendwie zwischengespeichert werden. Hast du die Problematik jetzt verstanden???
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 12:48

Dafür gibt es sicherlich verschiedene herrangehensweisen...

Wieviele Benutzer gibt es denn?

Bei vielen Benutzern:

1. Jede Log-Zeile lesen
2. Benutzernamen rausfiltern
3. Datei für den Benutzer mit "a" (append) öffnen
4. Zeile reinschreiben
5. Benutzerdatei schließen

Wenn es nur wenige gibt, könnte man natürlich auch die Dateien jeden Benutzers offen halten, die ganze LOG durchparsen und erst dann alle schließen...
Aber dann braucht man auch eine "verwaltung" der Benutzer-Dateihandles...
Ich weiß nicht wo die sinnvolle Grenze der offenen Dateihandles liegt ;)

Oder Parse die gesammte LOG Datei und halte alle Daten getrennt nach Benutzern im Speichern. Danach die Daten pro Benutzer rausschreiben... Dann müßen die Log-File-Informationen allerdings im RAM passen ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Dienstag 7. Juni 2005, 12:54

Es gibt in etwa 100 Benutzer.
Aber wie würde ich den Benutzernamen rausfiltern, zumal ich ja nur weiss, dass es z.B. an Stelle 3 ist, also A[2], was müsste ich denn noch an diesem Code verändern, um es anzupassen? Sorry wenn ich dich so stresse, aber ich mach hier ein Praktikum und will nen guten Eindruck hinterlassen:-)

Code: Alles auswählen

infile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\20050221.log", 'r')
outfile = file( "C:\\Documents and Settings\\jcourtis\\Desktop\\MailLog\\maillog.log", 'w')

for line in infile:
    if "1031" in line:
        outfile.write(line)

infile.close()
outfile.close()
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 7. Juni 2005, 12:57

jens hat geschrieben:Oder Parse die gesammte LOG Datei und halte alle Daten getrennt nach Benutzern im Speichern. Danach die Daten pro Benutzer rausschreiben... Dann müßen die Log-File-Informationen allerdings im RAM passen ;)
Nö. Es gibt ja sowas wie Virtual Memory (von Linux bereits seit 0.11/0.11+VM also ab Dezember 1991 unterstützt). Dabei wird der fehlende RAM-Speicher vom Swap, also deiner Festplatte, bereitgestellt. Nur ist halt die Performance davon.. suboptimal. VM wird aber von allen moderneren Betriebssystemen unterstützt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
janni80

Dienstag 7. Juni 2005, 13:00

Sorry aber ich verstehe gerade nur Bahnof.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 13:25

janni80 hat geschrieben:Sorry aber ich verstehe gerade nur Bahnof.
Leonidas meint nur, das es egal ist, ob die gesammten Log-Daten in's Physikalische RAM passen, da das Betriebssystem per SWAP die Daten die gerade nicht mehr gebraucht werden vom RAM auf die Festplatte schreiben würde. Somit ist in gewissen Grenzen, die größe der Log-Files egal.
Siehe auch: http://lexikon.freenet.de/Virtuelle_Speicherverwaltung

Zurück zum Problem: Schau mal .split() an:

Code: Alles auswählen

teststring = "2005-2-6 0:0:6 GMT 192.168.40.15 samsungproxye.sdsg.de - SAMSUNGEXCGW1 106.101.1.108 smkim@samsung.de 1020 dr$j51$6mx$uu2h@c6rg5g9 1 0 2870 1"
gesplittet = teststring.split()
print gesplittet
print gesplittet[8]
liefert:

Code: Alles auswählen

['2005-2-6', '0:0:6', 'GMT', '192.168.40.15', 'samsungproxye.sdsg.de', '-', 'SAMSUNGEXCGW1', '106.101.1.108', 'smkim@samsung.de', '1020', 'dr$j51$6mx$uu2h@c6rg5g9', '1', '0', '2870', '1']
smkim@samsung.de

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Dienstag 7. Juni 2005, 13:47

Wenn ich deinen Code ausführen will,dann geschieht rein gar nichts.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 7. Juni 2005, 13:50

Dann machst du irgendwas falsch ;) Bei mir geht's...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten