Loggen in unterschiedliche Dateien
![](https://secure.gravatar.com/avatar/31c211cb0205bbcc687cda60fc8ea9b9.jpg?s=120&d=mm&r=g)
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. ;-)
![](https://secure.gravatar.com/avatar/31c211cb0205bbcc687cda60fc8ea9b9.jpg?s=120&d=mm&r=g)
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
![](https://secure.gravatar.com/avatar/e88b046bd99c34714b60a04eaf51d334.jpg?s=120&d=mm&r=g)
rkoch83--- via python-de wrote:
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?
Du wirst vom Blitz getroffen und dann von einem Bus überfahren ;) Im Ernst, ich würde wahrscheinlich nur die Zieldatei des FileHandlers variieren und alles andere in Ruhe lassen. Hier mein Versuch, die wesentlichen Teile vom RotatingFileHandler zu klauen: import logging import os class RetargetableFileHandler(logging.FileHandler): def retarget(self, filename): if self.stream: self.stream.close() self.stream = None self.baseFilename = os.path.abspath(filename) if not self.delay: self.stream = self._open() def get_filename(project, experiment): return "/home/xnat/xnat_data/logs/{}_{}.log".format(project, experiment) first = True project = "spam" for experiment in ["foo", "bar", "baz"]: if first: # run once logger = logging.getLogger() handler = RetargetableFileHandler(get_filename(project, experiment)) handler.setFormatter( logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s: %(message)s')) logger.addHandler(handler) logger.setLevel(logging.DEBUG) first = False else: # specify new destination handler.retarget(get_filename(project, experiment)) # log something logger.info("Project: {}, Experiment: {}".format(project, experiment))
participants (2)
-
Peter Otten
-
rkoch83@googlemail.com