首页 > 解决方案 > 为什么这个自定义记录器不将信息记录到控制台和文件?

问题描述

我在 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 没有效果。

标签: python

解决方案


setLevel()的文档中,您可以看到根记录器使用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)

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


推荐阅读