我必须编写一个代码来将消息记录到文件和stdout。我通读了日志记录模块并完成了任务。但只是想知道是否有任何有效的方法将处理程序关联到Logger对象?
logger = logging.getLogger('TEST')
logger.setLevel(logging.DEBUG)
#create a file handler
file_log_handler = logging.FileHandler('logfile.log',mode='w')
#logger.addHandler(file_log_handler)
#create a stderr_handler
stderr_log_handler = logging.StreamHandler()
stderr_log_handler.setLevel(logging.ERROR)
#logger.addHandler(stderr_log_handler)
# Create formattar
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# Add Handler to Formattar
file_log_handler.setFormatter(formatter)
stderr_log_handler.setFormatter(formatter)
# add logger to Handler
logger.addHandler(file_log_handler,stderr_log_handler)
# application code:
logger.info('debug message')
logger.warning('This is a warning message')
logger.debug('This is a debug message')
logger.error('This is a error message')
在上面的代码中,我有两个处理程序(file_log和stderr_log),当像这样添加时
logger.addhandler(file_log_handler)
logger.addhandler(stderr_log_handler)
有效,但在这样的单一陈述中给出:
logger.addhandler(file_log_handler,stderr_log_handler)
不起作用。我尝试使用它作为列表,但没有运气。
有没有一种有效的方法来实现这一目标?
答案 0 :(得分:2)
嗯,从source code可以看出,处理程序需要安全(请注意_acquireLock()和_releaseLock(),因为可以共享记录器
您可以做的是:
logger.handlers.extend([file_log_handler, stderr_handler])
但我建议反对。
避免重复的最好方法是我们程序员总是这样做...写一个函数:
def add_many_handlers(logger, handler_list):
for handler in handler_list:
logger.addHandler(handler)
addHandler
来源:
def addHandler(self, hdlr):
"""
Add the specified handler to this logger.
"""
_acquireLock()
try:
if not (hdlr in self.handlers):
self.handlers.append(hdlr)
finally:
_releaseLock()