为什么我的记录器多次记录相同的东西?

时间:2017-01-25 10:51:16

标签: python

我希望创建两个不同的记录器,这就是我所拥有的:

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多次记录同一事物?

1 个答案:

答案 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

    #....

来自documentation;

  

如果[Logger.propagate]的计算结果为true,则记录到此记录器的事件将传递给更高级别(祖先)记录器的处理程序,以及附加到此记录器的任何处理程序。消息直接传递给祖先记录器的处理程序 - 既不考虑有问题的祖先记录器的级别也不考虑过滤器。

logger.propagate的默认值为TruegetLogger的构造函数设置的main.app

请注意,记录器的名称可以是"以句点分隔的层次结构值",提供父子关系(正如您在两个对象main.app.module和{{1}中所做的那样},后者是孩子)。

Logger Objects section;

  

该名称可能是一个以句点分隔的层次结构值,例如foo.bar.baz(例如,它也可能只是普通的foo)。分层列表中较低的记录器是列表中较高的记录器的子项。