sam*_*sam 5 python logging python-3.x
我正在使用Python 3.6.4。我首先遇到一个logger.setLevel(logging.INFO)被忽略的问题,遇到了这个答案,这使我感到困惑,并引发了这个问题。
根据以下代码,
1.为什么
logging.info('2')要在代码段2中打印而不是在代码段1中打印?(不是logging.info()模块级别的功能吗?为什么命名记录器会影响此调用?)2.为什么
logger.info('3')要打印,但不打印logger.info('1')?
>>> import logging
>>> logger = logging.getLogger('foo') # named logger
>>> logger.setLevel(logging.INFO)
>>> logger.info('1')
>>> logging.info('2') # prints nothing
>>> logger.info('3')
INFO:foo:3
Run Code Online (Sandbox Code Playgroud)
>>> import logging
>>> logger = logging.getLogger() # no name
>>> logger.setLevel(logging.INFO)
>>> logger.info('1')
>>> logging.info('2') # printed
INFO:root:2
>>> logger.info('3')
INFO:root:3
Run Code Online (Sandbox Code Playgroud)
如您所指出的,这些片段之间的区别在于如何获取logger对象:
logger = logging.getLogger('foo')
logger = logging.getLogger()
Run Code Online (Sandbox Code Playgroud)
关键是,在第二种情况下,您将获得“ root”记录器。另一方面,在第一种情况下,您获得的根的“ sublogger”称为foo。
现在,让我们逐步进行。
logger.setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)
在这里,您可以设置记录器的级别。在第一种情况下,您将设置记录器的级别foo。创建时,新的记录器没有级别,因此它们会处理每条消息。在这里,您说的是只处理严重性INFO更高的消息。但是,第二种情况logger是根记录器。令人困惑的是,与新记录器不同,根记录器默认级别为WARN,因此,除非您对其进行更改,否则不会处理低于该级别的任何内容。因此,在此行之后:
WARNlevel,并将foo记录器设置为INFOlevel。INFOlevel。logger.info('1')
Run Code Online (Sandbox Code Playgroud)
第一条记录的行。在这两种情况下,您的行为相同。该消息为INFO,并logger设置为该严重性,因此该消息得到处理。但是,您没有设置任何处理程序logger,因此该消息实际上什么也没做。
logging.info('2')
Run Code Online (Sandbox Code Playgroud)
现在,这更有趣。这里重要的是logging.info实际执行的操作,这与您调用inforoot logger对象的方法不同:
在根记录器上记录严重性为“ INFO”的消息。如果记录器没有处理程序,请调用basicConfig()以添加具有预定义格式的控制台处理程序。
因此,如果没有为根记录器注册任何处理程序,则此函数将自行创建控制台处理程序。因此,由根记录器或子记录器收到的任何消息现在都将打印到控制台。但是,在第一种情况下,事实证明根记录器仍具有其默认的严重性过滤器WARN,因此已注册控制台处理程序,但实际上忽略了该消息。但是,在第二种情况下,您将根记录程序的严重性级别设置为INFO,因此消息由控制台处理程序处理和打印。
logger.info('3')
Run Code Online (Sandbox Code Playgroud)
希望现在应该有意义。现在,您已将控制台处理程序附加到根记录器。在第一种情况下,logger是foologger,其严重性设置为INFO,因此将处理消息,并且由于它是root logger的子记录器,因此由为其注册的控制台处理程序将其打印出来。在第二种情况下,您只是登录到具有INFO严重性和已注册控制台处理程序的root记录器。
请注意,在第一种情况的最后一行中,foo即使根记录器的严重性级别为,记录器处理的消息也由在根记录器中注册的处理程序处理WARN。日志处理程序不负责按严重性进行过滤,这是由记录器本身完成的,因此,一旦记录器决定应该处理一条消息,它将由其所有处理程序以及来自父记录器的处理程序进行处理。这是一项非常有用的功能,因为它使您可以拥有较高的系统级别日志级别,而对于更感兴趣的特定模块(例如,用于调试或仅进行报告)则具有较低的日志级别。