我希望创建两个不同的记录器,这就是我所拥有的:
import logging
def logger(logger_name, level):
"""Create logger with given name and level"""
# Set up logger
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
# print(logger.handlers)
formatter = logging.Formatter('%(levelname)-8s %(asctime)s %(message)s')
handler = logging.StreamHandler()
handler.setFormatter(formatter)
# Set level
handler.setLevel(level)
# Add handlers to logger
logger.addHandler(handler)
return logger
LOGGER1 = logger(logger_name='main_app', level=logging.INFO)
LOGGER2 = logger(logger_name='main_app.module', level=logging.DEBUG)
LOGGER1.info('one')
LOGGER2.info('two')
LOGGER1.info('three')
这是记录的内容:
INFO 2017-01-25 11:49:45,209 one
INFO 2017-01-25 11:49:45,209 two
INFO 2017-01-25 11:49:45,209 two
INFO 2017-01-25 11:49:45,210 three
我在这里做错了什么?
如何防止LOGGER2
多次记录同一事物?
答案 0 :(得分:6)
将属性propagate
更改为False
,如下所示
def logger(logger_name, level):
"""Create logger with given name and level"""
# Set up logger
logger = logging.getLogger(logger_name)
#stops logging messages being passed to ancestor loggers
logger.propagate = False
#....
如果[Logger.propagate]的计算结果为true,则记录到此记录器的事件将传递给更高级别(祖先)记录器的处理程序,以及附加到此记录器的任何处理程序。消息直接传递给祖先记录器的处理程序 - 既不考虑有问题的祖先记录器的级别也不考虑过滤器。
logger.propagate
的默认值为True
中getLogger
的构造函数设置的main.app
。
请注意,记录器的名称可以是"以句点分隔的层次结构值",提供父子关系(正如您在两个对象main.app.module
和{{1}中所做的那样},后者是孩子)。
该名称可能是一个以句点分隔的层次结构值,例如foo.bar.baz(例如,它也可能只是普通的foo)。分层列表中较低的记录器是列表中较高的记录器的子项。