[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