要在没有 basicConfig
的情况下在 Python 中设置日志记录,我们将执行以下步骤:
- 设置文件处理程序。
- 设置文件处理程序的日志记录级别。
- 设置格式化程序。
- 将文件处理程序指向格式化程序。
- 获取记录器对象。
- 设置记录器对象的日志记录级别。
- 将文件处理程序作为处理程序添加到记录器对象。
- 在记录器上使用
.info()
、.warning()
等方法。
这些步骤由以下代码执行:
import logging
file_handler = logging.FileHandler('./out.log', 'a')
file_handler.setLevel(logging.DEBUG)
format_string = '%(asctime)s\t%(levelname)s: %(message)s'
formatter = logging.Formatter(format_string)
file_handler.setFormatter(formatter)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
logger.info('visible info')
logger.debug('invisible debug')
设置文件处理程序的日志记录级别和设置记录器的日志记录级别有什么区别?
最佳答案
好的,这里有一小段需要解决的代码:
import logging
# Declare a function to log all 5 levels with different information
def log_all_levels(logger):
logger.debug("Debug from logger {}".format(logger.name))
logger.info("Info from logger {}".format(logger.name))
logger.warning("Warning from logger {}".format(logger.name))
logger.error("Error from logger {}".format(logger.name))
logger.critical("Fatal from logger {}".format(logger.name))
# This file handler will track errors from all loggers
all_errors_handler = logging.FileHandler('errors.log')
all_errors_handler.setLevel(logging.ERROR)
# This file handler will only be used in a specific region of code
foo_info_handler = logging.FileHandler('foo_info.log')
foo_info_handler.setLevel(logging.INFO)
foo_info_handler.addFilter(lambda r: r.levelno == logging.INFO)
# The following loggers will be used in the main execution
foo_logger = logging.getLogger("Foo")
nameless_logger = logging.getLogger("nameless")
foo_logger.setLevel(logging.INFO)
nameless_logger.setLevel(logging.DEBUG)
loggers = (foo_logger, nameless_logger)
# Set each logger up to use the file handlers
# Each logger can have many handlers, each handler can be used by many loggers
for logger in loggers:
logger.addHandler(all_errors_handler)
debug_file_handler = logging.FileHandler('{}.log'.format(logger.name))
debug_file_handler.setLevel(logging.DEBUG)
logger.addHandler(debug_file_handler)
if logger.name == "Foo":
logger.addHandler(foo_info_handler)
# Let's run some logging operations
for logger in loggers:
log_all_levels(logger)
有 2 个记录器 - foo_logger
设置为信息级别,nameless_logger
设置为调试级别。它们都使用错误和调试处理程序,但是只有 foo_logger
使用 foo_file_handler
。现在有不同级别的记录器和文件处理程序,以多对多的关系连接在一起。
正如您所见:
errors.log
将包含来自两个记录器的错误。对于现实生活场景来说这是不言自明的 - 阅读仅包含错误的日志有助于调试代码。Foo.log
和nameless.log
将包含有关这些记录器的所有可能信息,并尊重其级别。因此,前者将包含信息和更高级别,而后者将跟踪调试和更高级别。记录每个对象可能会创建大量文件,但在尝试检测某些特定于对象的错误时可能至关重要。foo_info
是一个非常特殊的文件处理程序,它仅允许来自关联记录器的信息级别。当您进入潜在不安全或未经测试的代码区域并希望查看该代码块中到底发生了什么而无需浏览所有程序日志时,此类文件可以成为您的救星。
您可以使用日志记录执行许多其他操作 - 设置您自己的日志记录规则、创建日志记录层次结构、创建记录器工厂 - 可能性是无限的。日志记录应该具有灵 active - 例如,允许记录器对象和文件处理程序具有不同且单独的日志记录级别,并让程序员根据需要将它们组合在一起。
我希望小代码练习和我的解释能够消除任何进一步的疑虑 - 但我确实建议看看 Logging Cookbook或docs如果您还需要更多示例。
关于python - 文件处理程序的日志级别与记录器的日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57813067/