Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使我将级别设置为info,python日志根记录器也不会显示info_Python_Logging - Fatal编程技术网

即使我将级别设置为info,python日志根记录器也不会显示info

即使我将级别设置为info,python日志根记录器也不会显示info,python,logging,Python,Logging,我创建了以下脚本。你们谁能解释一下为什么输出是如下所示的 来源 输出 具体地 这里的logger.info和logging.info有什么区别 为什么logger.isenablefor(logging.DEBUG)是True而logger.DEBUG('DEBUG')没有显示任何内容 为什么logger.info没有输出,而logging.info有输出 如果添加了参数name,则创建Logger类的实例。否则,它将返回根记录器。因此,在本例中,程序将通用记录器用作函数logging.debu

我创建了以下脚本。你们谁能解释一下为什么输出是如下所示的

来源 输出 具体地

  • 这里的
    logger.info
    logging.info
    有什么区别

  • 为什么
    logger.isenablefor(logging.DEBUG)
    True
    logger.DEBUG('DEBUG')
    没有显示任何内容

  • 为什么
    logger.info
    没有输出,而
    logging.info
    有输出


  • 如果添加了参数
    name
    ,则创建Logger类的实例。否则,它将返回根记录器。因此,在本例中,程序将通用记录器用作函数
    logging.debug
    logging.info
    logging.warning
    logging.info
    ,需要澄清以下几点:

  • 根记录器的默认日志级别为
    警告
  • 如果不执行任何操作(即未设置任何处理程序或格式化程序),则不会初始化根记录器:

    >>> import logging
    >>> logging.root.handlers
    []
    
  • 好的,但是您发现了问题:当日志记录级别设置为
    DEBUG
    时,根日志记录器未按预期工作。调试消息被忽略。对于相同的未配置根记录器,警告消息输出正常。为什么呢

    请记住,我们现在没有根记录器的任何处理程序。但是,通过调查,我们确实看到:

        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)
            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
                sys.stderr.write("No handlers could be found for logger"
                                 " \"%s\"\n" % self.name)
                self.manager.emittedNoHandlerWarning = True
    
    也就是说,如果找不到处理程序,我们有一个
    lastResort
    用于备份。您可以参考
    lastResort
    的定义,它是用日志级别
    警告
    初始化的。同时,调试消息没有此备份,因此在未设置处理程序时将忽略这些消息

    关于您的问题:

  • 这两个记录器是相同的,因为当
    getLogger()
    没有收到任何参数时,将返回根记录器
  • 见下文: Logger.isEnabledFor(lvl)

    指示严重级别为lvl的消息是否会 将由此记录器处理。此方法首先检查模块级别 通过logging.disable(lvl)设置的级别,然后记录器的有效 由getEffectiveLevel()确定的级别

  • logging
    模块中调用任何日志函数都将使用
    basicConfig()
    初始化根日志记录器,这将添加一个默认处理程序,以便对
    logger
    的后续调用也将起作用

  • 您应该做的是,使用
    logging.basicConfig()
    为根记录器设置默认处理程序,并根据记录器级别和消息级别输出消息。

    谢谢@Ares Ou。我明白你关于
    记录器的行为的观点。您还可以解释一下为什么
    日志记录.debug
    日志记录.debug
    日志记录.debug
    是同一件事的情况下起作用。它们都是
    根日志记录程序
    ,但是当您调用
    日志记录.debug
    时,调用了
    基本配置()
    ,这会产生不同。如果在上面的代码之后调用
    logger.debug('debug')
    ,您将看到输出
    debug:root:debug
    ,那么您就会理解。您的意思是,如果根记录器尚未初始化,则对
    logging.log
    的任何调用都将使用
    basicConfig()
    初始化根记录器?否!你可以阅读
    basicConfig()
    仅在
    root
    没有
    handler
    时调用如果我理解正确,记录器实例正在处理信息和调试,但(默认)处理程序不是?也许您可以澄清记录器级别和处理程序级别之间的区别。
    >>> import logging
    >>> logging.root.handlers
    []
    
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)
            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
                sys.stderr.write("No handlers could be found for logger"
                                 " \"%s\"\n" % self.name)
                self.manager.emittedNoHandlerWarning = True