Logfile mit Informationen aus verschiedenen Modulen

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.
Antworten
PhiThi
User
Beiträge: 6
Registriert: Freitag 23. März 2012, 11:06

Freitag 23. März 2012, 11:19

Hallo liebe User!

Ich bin realtiv neu in Python und kontaktier euch nachdem ich mit meinen Versuchen gescheitert bin.
Folgendes Problem:

Ich habe einen MediaServer der Musik streamt. Ich will Zugriffe auf den Server mitloggen und zwar drei Infos: die IP, den Songtitel und ob der Stream ganz geladen wurden. Die Informationen kann ich bereits aus den einzelnen Modulen auslesen und auch loggen. Mein Problem besteht nun darin, dass dies nur für einen Zugriff zu einer Zeit funktioniert. Würden zwei User gleichzeitig zugreifen, wird ins Logfile folgendes geschrieben:
IP XXXXXX greift zu
IP XXXXXX greift zu
Titel XXXXX wird gespielt
Titel XXXXXX wird gespielt

Ich muss also die einzelnen Informationen miteinander verknüpfen und dann ins logfile schreiben.

Eventuell kann mir jemand eine kleine Starthilfe / Idee geben.

Vielen Dank!
deets

Freitag 23. März 2012, 11:29

Dazu wirst du irgendwelchen Kontext benoetigen. Ohne dein Produkt zu kennen wird das schwierig. Denn das Beste fuer sowas waere natuerlich eine Session-ID, der ein bestimmter User zugeordnet ist.

Aber die naechstbeste Alternative hast du doch schon selbst - die IP. Stell die doch allen Zugriffen voran, dann hast du (modulo mehrerer Leute hinter einer NAT) ein gutes Kriterium zur Buendlung deiner Daten.
PhiThi
User
Beiträge: 6
Registriert: Freitag 23. März 2012, 11:06

Freitag 23. März 2012, 12:07

Ok Danke schon mal.

Das Produkt ist der freie Server "Zeya". Ich habe bis jetzt versucht eine Klasse in einem extra Modul zu schreiben, welche die verschiedenen Informationen sammelt. Das mit der Session ID hab ich auch schon überlegt. Ich komme nur iwie nicht drauf wie ich eine Instanz dieser Klasse z.B. als Name die Session ID oder halt die IP gebe. Ein Instanziierung läuft ja nach dem Prinzip neueInstanz = Klasse(parameter) ab. Meine Idee war, dass neueInstanz zb die Session ID wär.

Was meinst du mit "modulo mehrerer Leute hinter einer NAT"? Ich kenne beide Begriffe aber versteh die Ausage nich.
deets

Freitag 23. März 2012, 12:29

Damit meinte ich, dass wenn mehrere Benutzer aus einem hinter einer IP liegenden Netzwerk via NAT zugreifen du das eben nicht unterscheiden kannst.

Dein Instanz-Parameter-Frage bzw. Problem verstehe ich nicht, das haengt auch alles davon ab, wo und wie du loggst und die Infos zusammensammelst.
lunar

Freitag 23. März 2012, 13:24

@PhiThi: Anders gesagt, Du musst eben herausfinden, ob Du an den Stellen, an denen Du Aktionen loggst, Zugriff auf irgendeine Information hast, welche den Nutzer eindeutig identifiziert, sei es IP-Adresse, Session-ID, Benutzername oder was auch immer. Diese Information musst Du dann in die Log-Einträge einfügen.

Welche Information das konkret ist, und wie Du an diese Information gelangst, hängt nun davon ab, wie Zeya implementiert ist und welche API es bietet. Das wissen wir aber eben so wenig wie Du, und sofern nicht gleich jemand vorbei kommt, der Zeya kennt (was eher unwahrscheinlich ist), bleibt uns nur der Blick in die Dokumentation oder den Quelltext. Das aber kannst Du genauso gut selbst erledigen.
PhiThi
User
Beiträge: 6
Registriert: Freitag 23. März 2012, 11:06

Montag 26. März 2012, 12:10

Ok das mit dem NAT hab ich verstanden, ich geh zZ mal davon aus, dass dieser Fall nicht eintritt (in meiner Anwendung ist es unwahrscheinlich, dass zwei User mit der gleichen IP zugreifen, dh die IP wird eindeutig sein)

Eventuell sollt ich mich wirklich noch konkreter ausdrücken. Ich versuch das nochmal:

Ich versuch also in einem von mir erstellten Modul eine Klasse, nennen wir sie "logclass" zu beschreiben welche die Informationen sammelt. Diese Klasse wird die Infos erst loggen wenn alle (IP, Songtitel, Stream vollständig) vorhanden sind (ich will nämlich ein log file in dem jeweils in einem Absatz alle Infos zu einem Zugriff stehen).

Zeya besteht nun aus mehreren Modulen. Eine Instanz meiner Klasse "logclass" soll erzeugt werden wenn jemand versucht auf den Server zuzugreifen (dies geschieht in einem Modul des Servers). An dieser Stelle kann auch gleich die IP ermittelt werden. In einem anderen Modul des Servers werden die mp3 files verarbeitet und hier kann man schön den aktuellen Titel abfragen. Wie kann ich jetzt in einem anderen Modul auf meine zuvor erzeugte Instanz der Klasse "logclass" wieder zugreifen? Das würde mir schon weiterhelfen.

Vielen Dank
BlackJack

Montag 26. März 2012, 12:22

@PhiThi: Du müsstest Dir das Exemplar halt irgendwo merken, wo man aus dem anderen Modul wieder darauf zugreifen kann. Eventuell möchtest Du das Exemplar auch nicht erstellen wenn sich jemand verbindet, sondern grundsätzlich beim Start des Servers und es an das Modul binden. Dann kann jedes andere Modul das Modul importieren und darauf zugreifen. Das Objekt könnte dann eine Abbildung von IDs, in diesem Falle IPs, auf Objekte für Logeinträge verwalten. Jedes Modul könnte sich dann zu einer IP den passenden aktuellen Logeintrag und die Informationen darin ergänzen. Und wenn alle beisammen sind, kann man den Eintrag als eine Einheit protokollieren lassen.
deets

Montag 26. März 2012, 12:25

Da gibt es eine grosse Anzahl von Ansaetzen, die in weiten Teilen von dem Server abhaengen. Aber ein uebergreifenden Ansatz ist threadlocal:

http://docs.python.org/library/threadin ... ding.local

Darin speicherst du deine initiales Instanz, und greifst fuer den Request-Zyklus auf sie zu.
PhiThi
User
Beiträge: 6
Registriert: Freitag 23. März 2012, 11:06

Donnerstag 29. März 2012, 16:00

@Deets: ok ich probier schon fleißig rum mit dem threading Modul. Wollte kurz fragen ob ich die Grundidee verstanden hab:
Bei jedem neuen Client Request erstell ich einen neuen thread. dieser soll warten bis er alle Infos(IP, titel, stream vollständig geladen?) erhalten hat. dann soll der thread die Infos loggen und zu machen. Die Infos speichere ich z.B. mittels data=local() und data.IP=123.123.123 ab.
deets

Donnerstag 29. März 2012, 17:53

Nein, du erstellst keinen neuen Thread. Du hast *EIN* globales (modul-global, oder als Klassenvariable) threading.local-Objekt. NICHT bei jedem Request neu!!!

Und auf dem setzt du dann so nach und nach alle die Daten die du loggen willst, und bei Ende des Requests (wie immer du das mitbekommst, kenne ja deinen Server nicht) gibst du dann alles aus.
Antworten