python日志级别未设置

时间:2018-08-10 20:32:34

标签: python logging

在文件1中:

def get_logger():
    return logging.getLogger(_LOGGER_NAME)


def init_logger():
    message_format = logging.Formatter(fmt='%(asctime)s %(name)s >>> %(message)s',
                                       datefmt='%Y-%m-%d %H-%M-%S')

    console_info_handler = logging.StreamHandler(sys.stdout)
    console_info_handler.setLevel(logging.INFO)
    console_info_handler.setFormatter(fmt=message_format)

    logger = logging.getLogger(_LOGGER_NAME)
    logger.addHandler(console_info_handler)
    logger.setLevel(logging.INFO)

    return logger

在文件2中:

if name == '__main__':
    logger = get_logger()
    logger.info(logger.level)

不打印任何内容(当然可以导入)。如果我去:

if __name__ == '__main__':
    logger = get_logger()
    logger.critical(logger.level)

输出为0,而不是预期的20。因此,看来记录器级别未设置为我认为的水平。而且,该级别比我想象的要低,但是它仍然没有登录logger.info。我在这里做错了什么?哦,还有一个额外的问题(因为我偷了上面的代码并且不知道python的任何日志记录复杂性),如果记录器的级别和处理程序的级别发生冲突,如何解决日志消息?

2 个答案:

答案 0 :(得分:1)

文件2仅调用get_logger(),而不调用init_logger()。因此,永远不会在记录器上调用setLevel,因此给定了默认值NOTSET

看看:https://docs.python.org/3/library/logging.html#logging.Logger.setLevel

默认情况下,根记录器的创建级别为WARNING。这就是为什么logger.info(logger.level)不执行任何操作的原因,因为INFOWARNING以下。另一方面,logger.critical(logger.level)输出0,因为这是NOTSET的数值。

要让它执行您想要的操作,只需在第二个文件中调用init_logger()

if __name__ == '__main__':
    logger = init_logger()
    logger.info(logger.level)

要回答您的奖励问题:处理程序会通过记录器获取任何消息。

如果记录器的级别为DEBUG,并且处理程序的级别为INFO,则处理程序将从DEBUG级别开始接收所有消息,但仅输出INFO级以上的邮件。

答案 1 :(得分:0)

您没有呼叫init_logger()(在呼叫logger.info()之前),因此未设置非默认_LOGGER_NAME的级别。

还要注意拼写错误:if name == '__main__':-> if __name__ == '__main__':