我有一个使用built in logging模块的多线程Python应用程序。为了控制日志记录级别并使以后更容易将StreamHandler
与FileHandler
交换,我创建了一个由每个模块调用的公共帮助函数来创建一个相同的记录器(除了它的名称)
如何解决此问题?
要点
self._logger.info("Logger Setup")
)threading.Thread.getName()
),并确认同一线程正在调用导致多个日志。记录器创建 - 正在运行
import logging
import sys
def createSystemLogHandler(logger):
# This is now called once at the logger's root
ch = logging.StreamHandler(sys.stdout) # Normal output is to stderr which doesn't show up on Window's CMD
format = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
ch.setFormatter(format)
logger.addHandler(ch)
return logger
def configureSystemLogger(name='', level=logging.WARNING):
logger = logging.getLogger(name)
logger.setLevel(level)
logger.info("Logger Setup")
return logger
示例输出
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
2012-04-25 21:59:40,720 - INFO - HW_MGR - Logger Setup
答案 0 :(得分:2)
我的猜测是你有多个处理程序(即,多次发出一条消息;但在重新阅读你的问题时,看起来你已经知道了)。要调试它,请尝试:
logging.getLogger("").handlers
(即根记录器上的处理程序)addHandler()
logging_tree
module pdb
跟踪日志消息的生命周期(即,在调用self._logger.info(…)
之前设置断点,然后单步执行该功能)。