当设置 Python logging 的 level(即日志等级)时,有时可能会遇到设定无效的情况。这种情况可能由多种原因引起,本攻略将提供几种常见的失败原因以及相应的解决方法。
问题1:未正确设置 logger 的名称
在 Python logging 中,每个 logger 都有一个唯一的名称。如果我们要设置某个 logger 的日志等级,我们需要指定该 logger 的名称。如果我们未能正确指定名称,则会导致设定无效。
以下示例展示了如何使用 Python logging 设置默认 logger 的日志等级为 WARNING:
import logging
logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.WARNING)
注意,我们在代码的第 3 行使用了 getLogger()
方法来获取默认 logger。如果我们在这里输入错误的名称,则会导致设置失败。
问题2:设置的 level 低于 handler 的 level
在 Python logging 中,除了 logger 之外,还有 handler。Handler 负责将日志发送到不同的目标(例如文件、网络等)。每个 handler 都有自己的日志等级(即 level 属性)。如果我们要设置某个 logger 的日志等级,我们需要先设置其添加过的 handler 的日志等级。如果我们设置的日志等级低于 handler 的日志等级,则会导致设定无效。
以下示例展示了如何使用 Python logging 在文件 example.log
和标准输出其中添加两个 handler,并设置其中一个 handler 的日志等级为 INFO。如果我们将 logger 的日志等级设置为 DEBUG,则所有的日志都会输出到文件和标准输出,因为 DEBUG 级别低于 INFO 级别:
import logging
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.debug('this message should be logged in both file and console')
logger.info('this message should only be logged in console')
注意,在代码的第 3 行之后,我们首先设置了 logger 的日志等级为 DEBUG。然而,我们在第 7 行和第 10 行设置了两个 handler 的日志等级分别为 DEBUG 和 INFO。由于 DEBUG 级别低于 INFO 级别,所以 logger 在输出日志时会忽略所有等级为 INFO 及以下的日志。因此,在第 15 行的日志信息只会显示在控制台上,而不会被写入日志文件。
通过以上示例,我们可以看到日志级别、logger 和 handler 之间的关系非常重要。只有当所有这些层次上的级别都设置正确,才能使日志输出达到我们的预期。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python logging设置level失败的解决方法 - Python技术站