Loggen in unterschiedliche Dateien

04/08/2016 - 10:35 von rkoch83 | Report spam
Moin,

ich habe ein Skript geschrieben, dass auf einer Webplattform (XNAT) ausgeführt wird, wenn Daten hochgeladen werden.

Um eventuelle Fehler zu entdecken, will ich einige Dinge in eine Datei loggen, die aber für jeden Upload neu angelegt werden soll.

Dem "Basic Tutorial" in der Doku folgend habe ich zunàchst folgendes probiert:

(Die Variablen project und experiment àndern sich bei jedem Upload und daher jeder Ausführung des Skripts.)

Version 1
==logging.basicConfig(
filename="/home/xnat/xnat_data/logs/{}_{}.log".format(project, experiment),
level=logging.DEBUG,
format='%(asctime)s %(message)s')

logging.info("Project: {}, Experiment: {}".format(project, experiment))

logging.shutdown()
==
Das hat beim ersten Durchlauf auch funktioniert. Die Datei wurde angelegt und korrekt hineingeloggt. Aber jeder weitere Aufruf des Scriptes loggt weiterhin *in diese Datei*. Obwohl ein neuer Dateiname generiert wird.

Spàter habe ich es dann mit einem neuen Logger probiert:


Version 2
==logging.basicConfig(
filename="/home/xnat/xnat_data/logs/{}_{}.log".format(project, experiment),
level=logging.DEBUG,
format='%(asctime)s %(message)s',
filemode='w')
logger = logging.getLogger(experiment)

logger.info("Project: {}, Experiment: {}".format(project, experiment))

logging.shutdown()
==
Diesmal wird jedesmal eine neuer Logger angelegt, der jedesmal einen anderen Namen tràgt, und der Parameter filemode='w' besagt, dass eigentlich jedesmal eine neue Datei erzeugt werden sollte.

Passiert aber nicht. Er loggt immer noch in die alte Datei.

Was sagt mir das?

1) Irgendwie làuft im Hintergrund die Python-Sitzung weiter (sonst würde der Dateiname nicht gespeichert bleiben).
2) Irgendwie muss ich Python mitteilen, dass ich a) in eine andere Datei loggen will und b) in die alte Datei nicht mehr speichern will.

Ich vermute, ich muss irgendwie manuell Filehandler zuweisen und ggfls. sogar entfernen(?). Aber wie?

Das Ausprobieren ist etwas beschwerlich, da ich das Skript erst auf die Webseite laden muss und dann einen Upload starten, der schließlich die Ausführung des Skripts in seiner "natürlichen Umgebung" anstößt.

Daher wàre ich für zielgerichtete Hinweise dankbar.

Laufen tut das ganze unter Python 2.7.6.

Robin

PS: Ich benutze Google Groups, da ich auf der Arbeit bin. Bitte keine Vorurteile. ;-)
 

Lesen sie die antworten

#1 rkoch83
04/08/2016 - 12:29 | Warnen spam
Ok, Ingrid habe jetzt hiermit erreicht was ich wollte:

Version 3
==logger = logging.getLogger(experiment)
logger.handlers = []
logger.addHandler(logging.FileHandler(
filename="/home/xnat/xnat_data/logs/{}_{}.log".format(project, experiment)))
logger.handlers[-1].setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s'))
logger.setLevel(logging.DEBUG)

logger.info("Project: {}, Experiment: {}".format(project, experiment))

del logging.Logger.manager.loggerDict[experiment]
==
Es erscheint mir nicht besonders elegant oder "pythonic" so in die Eingeweide des Moduls einzugreifen. Geht das schöner? Welche Risiken birgt diese Vorgehensweise?

Robin

Ähnliche fragen