Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Peter Otten <__peter__@web.de> Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Loggen in unterschiedliche Dateien Date: Thu, 04 Aug 2016 16:33:15 +0200 Organization: None Lines: 67 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: news.uni-berlin.de JA9/JyWrV2Th1ZPQgqaBmQ//tl4tCWO4T1uCChniabNg== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org X-Injected-Via-Gmane: http://gmane.org/ User-Agent: KNode/4.13.3 X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: Xref: csiph.com de.comp.lang.python:4503 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))