为什么调用logging.info会改变我的记录器打印的内容?

时间:2017-10-04 15:18:02

标签: python logging

我试图让Python记录内容,尽管已阅读了logging docshow-to,但我并不了解其行为。

我设置了全局日志级别,然后尝试记录一些内容:

logger = logging.getLogger()
print("Initially should be warn: %d" % logger.getEffectiveLevel())
logger.setLevel(logging.DEBUG)
print("Logger level: %d" % logger.getEffectiveLevel())

logger.info("Maybe I am printed?")

但是运行python my_script.py只是打印:

Initially should be warn: 30
Logger level: 10

但是,如果我添加一行logging.info来电,例如,

logger = logging.getLogger()
print("Initially should be warn: %d" % logger.getEffectiveLevel())
logger.setLevel(logging.DEBUG)
print("Logger level: %d" % logger.getEffectiveLevel())

logging.info("I am printed")
logger.info("Maybe I am printed?")

然后记录全部显示:

Initially should be warn: 30
Logger level: 10
INFO:root:I am printed
INFO:root:Maybe I am printed?

logging.info在做什么?

2 个答案:

答案 0 :(得分:2)

logging.info的调用是配置日志处理程序和格式化程序,以便它可以输出日志。如果您想自己动手,以下代码将对其进行设置:

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("boo")

有关配置日志记录的详细信息,请参阅本教程的configuring logging部分。

logging.info中提供了request.query_params.get('field') 调用设置日志记录的代码。如果不存在处理程序,它基本上只创建处理程序。

答案 1 :(得分:2)

第一个示例实际上会警告您无法找到记录器" root" see here)。这是因为,正如建议的那样,您没有为logger定义任何处理程序。

以下是logging.info的实施:

def info(msg, *args, **kwargs):
    """
    Log a message with severity 'INFO' on the root logger.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.info(msg, *args, **kwargs)

正如您所看到的,当没有找到处理程序时,它将调用basicConfig,它还将初始化一个默认处理程序,从而修复以下语句中的日志记录。