EDIT: добавлена рекомендация Ральфа использовать os.environ
Попытка реализовать одноэлементный регистратор, чтобы при каждом создании экземпляра регистратора он записывал только определенное имя файла.Пока не указано новое имя файла.
import logging
def singleton(myClass):
instances = {}
def getInstance(*args,**kwargs):
if myClass not in instances:
instances[myClass] = myClass(*args,**kwargs)
return instances[myClass]
return getInstance
@singleton
class Logger(object):
def __init__(self):
self.filename = os.environ['logger_filename']
self.log = self.init_logger()
def init_logger(self):
fh = logging.FileHandler(self.filename + '.log')
fmt = logging.Formatter("%(asctime)-6s: %(name)s - %(levelname)s - %(message)s)")
fh.setFormatter(fmt)
local_logger = logging.getLogger(self.filename)
local_logger.setLevel(logging.DEBUG)
local_logger.addHandler(fh)
return local_logger
То, что у меня есть выше, всегда будет записываться в файл "test1.log".
os.environ['logger_filename'] = "test1"
a = Logger()
b = Logger()
a.log.debug("Hello A")
b.log.debug("Hello B")
os.environ['logger_filename'] = "test2"
c = Logger()
c.log.debug("Hello C")
Поскольку синглтон будет содержать класс Logger в экземплярах, он просто вернет этот экземпляр и не запустит __init__
Если я обновлю синглтон следующим образом:
def singleton(myClass):
instances = {}
def getInstance(*args,**kwargs):
if myClass not in instances:
instances[myClass] = myClass(*args,**kwargs)
else:
instances[myClass].update_logger()
return instances[myClass]
return getInstance
@singleton
class Logger(object):
def __init__(self):
self.filename = os.environ['logger_filename']
self.log = self.init_logger()
def init_logger(self):
fh = logging.FileHandler(self.filename + '.log')
fmt = logging.Formatter("%(asctime)-6s: %(name)s - %(levelname)s - %(message)s)")
fh.setFormatter(fmt)
local_logger = logging.getLogger(self.filename)
local_logger.setLevel(logging.DEBUG)
local_logger.addHandler(fh)
return local_logger
def update_logger(self):
self.filename = os.environ['logger_filename']
self.log = self.init_logger()
os.environ['logger_filename'] = "test1"
a = Logger()
b = Logger()
a.log.debug("Hello A")
b.log.debug("Hello B")
os.environ['logger_filename'] = "test2"
c = Logger()
c.log.debug("Hello C")
Теперь будут сгенерированы 2 файла журнала (test1 и test2).Но test1 будет содержать два «Hello A» и два «Hello B».Как мне это исправить?