[Python-de] Loggen in unterschiedliche Dateien

Peter Otten __peter__ at web.de
Do Aug 4 10:33:15 EDT 2016


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




Mehr Informationen über die Mailingliste python-de