【发布时间】:2018-09-14 19:35:27
【问题描述】:
编辑:添加了 Ralf 使用 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”。我该如何解决这个问题?
【问题讨论】: