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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

Hi Jens,

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

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
janni80

Sorry aber ich verstehe gerade nur Bahnof.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
janni80

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

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben: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.
Ja, ich weiß, ich schreib manchmal umständlich. Danke jens.

Und den Benutzernamen kannst du mit .split('@') zerlegen.

Nun, vielleuicht bin ich etwas schwer von Begriff, aber ich verstehe nicht zum Schluss, was du machen musst. Also, du willst ein Logfile auswerten. Gut, an 10 Stelle muss "1012" stehen, oder können es auch andere Werte sein? Und zuletzt möchtest du das nach Benutzern in einzelne Dateien speichern?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
janni80

Hi,

ich gebe dir mal ein einfaches Beispiel um mein Problem zu verstehen
Wenn ich in Python folgenden Code ausführe erhalte ich folgendes Logfile-
Hier der Code nochmal:

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 "1021" in line:
        outfile.write(line)

infile.close()
outfile.close()
und das logfile sieht dann so aus:

9:30 admin_1 1021
9:30 admin_2 1021
9:31 guest_1 1021
9:31 admin_2 1021
9:32 guest_1 1021
9:45 guest_2 1021
9:46 admin_1 1021

So jetzt gut aufpassen:-) ich will jetzt das die zweite Spalte ausgelesen wird, d.h. in Spalte 2 steht irgendein Benutzername, wie z.B. admin_1. Der kann aber wie gesagt variieren, deswegen möchte ich auch kein Dictionary erstellen(das wäre viel bei etwa 100 Benutzern). Was ich nun will ist, eine Filterung nach den Benutzernamen, sprich admin_1, admin_2 usw. und dies dann ins logfile abspeichern.
Verstehst du jetzt mein Problem?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Bei mir geht's...
Kann ich bezeugen *g*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

janni80 hat geschrieben:So jetzt gut aufpassen:-) ich will jetzt das die zweite Spalte ausgelesen wird, d.h. in Spalte 2 steht irgendein Benutzername, wie z.B. admin_1. Der kann aber wie gesagt variieren, deswegen möchte ich auch kein Dictionary erstellen(das wäre viel bei etwa 100 Benutzern). Was ich nun will ist, eine Filterung nach den Benutzernamen, sprich admin_1, admin_2 usw. und dies dann ins logfile abspeichern.
Verstehst du jetzt mein Problem?
Ja, ich denke schon :)
Aber ich würde erstmal ein Dictionary machen, so nach dem Motto "Hauptsache es läuft, dann kann man immer noch verbessern."
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
janni80

na gut, ich wollte halt nicht die 100 Einträge in das Dictionary einpflegen, zumal das lange dauert und die Benutzernamen sich wöchentlich ändern.
Trotzdem vielen Dank für Zeit und Geduld.

Gruss Janni
Antworten