为什么此自定义记录器无法将信息记录到控制台和文件中?

时间:2019-07-05 01:09:18

标签: python

我在my_logging.py中定义了一个记录器功能:

def my_logger(name):
    print("warn:", name)
    logger = logging.getLogger(name)

    # Create handlers
    c_handler = logging.StreamHandler()
    f_handler = logging.FileHandler('logs/demo.log')
    c_handler.setLevel(logging.INFO)
    f_handler.setLevel(logging.INFO)

    # Create formatters and add it to handlers
    c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    c_handler.setFormatter(c_format)
    f_handler.setFormatter(f_format)

    # Add handlers to the logger
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)

    return logger

然后我在test.py中使用它:

import my_logging

logger = my_logging.my_logger(__name__)

logger.info("This is a test!")

它根本不记录日志!我之所以想将记录器放入一个函数中,是因为我希望它可以在使用相同记录配置的多个模块中使用。

这是什么问题?我进行了测试,似乎与处理程序的setLevel()方法有关。 logging.INFO无效。

1 个答案:

答案 0 :(得分:0)

setLevel()的文档中,您可以看到root记录器使用WARRING级别,并且很可能在处理程序中阻塞了INFO级别。

您必须为根记录程序设置INFO级别

logger = logging.getLogger(name)

logger.setLevel(logging.INFO)

如果您还需要DEBUG条消息,则必须为根记录程序和处理程序设置DEBUG级。

logger.setLevel(logging.DEBUG)

c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.DEBUG)

为处理程序使用不同级别,您只能在屏幕上或仅向文件发送调试消息。