1 回答
TA贡献1906条经验 获得超10个赞
好的,所以这里有一小段代码可以解决:
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
是一个非常特殊的文件处理程序,它只允许来自关联记录器的信息级别。当您输入潜在的不安全或未经测试的代码区域并希望查看该代码块中究竟发生了什么,而无需浏览所有程序日志时,此类文件可以成为救生员。
您还可以使用日志记录做许多其他事情 - 设置自己的日志记录规则、创建日志记录层次结构、创建记录器工厂 - 可能性是无穷无尽的。日志记录应该具有灵活性——例如,允许记录器对象和文件处理程序具有不同且独立的日志记录级别,并让程序员根据需要将它们组合在一起。
我希望小代码练习和我的解释可以消除任何进一步的疑问 - 但如果您仍然需要更多示例,我建议您查看Logging Cookbook或文档。
添加回答
举报