为了账号安全,请及时绑定邮箱和手机立即绑定

文件处理程序的日志级别与记录器的日志级别

文件处理程序的日志级别与记录器的日志级别

jeck猫 2022-05-19 15:59:12
要在没有 Python 的情况下 设置日志记录,basicConfig我们将执行以下步骤:设置文件处理程序。设置文件处理程序的日志记录级别。设置格式化程序。将文件处理程序指向格式化程序。获取记录器对象。设置记录器对象的记录级别。将文件处理程序作为处理程序添加到记录器对象。在记录器上使用.info(), .warning(), etc 方法。这些步骤由以下代码执行:import loggingfile_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')为文件处理程序设置日志记录级别和为记录器设置日志记录级别有什么区别?
查看完整描述

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. 现在有不同级别的记录器和文件处理程序,以多对多的关系连接在一起。

如您所见:

  1. errors.log将包含来自两个记录器的错误。对于现实生活场景来说,这是不言自明的——阅读仅包含错误的日志有助于调试代码。

  2. Foo.log并将nameless.log包含有关这些记录器的所有可能信息,并尊重它们的级别。所以前者将包含信息和更大,而后者将跟踪调试和更高级别。每个对象的日志记录可能会创建大量文件,但在尝试检测某些特定于对象的错误时可能至关重要。

  3. foo_info是一个非常特殊的文件处理程序,它只允许来自关联记录器的信息级别。当您输入潜在的不安全或未经测试的代码区域并希望查看该代码块中究竟发生了什么,而无需浏览所有程序日志时,此类文件可以成为救生员。

您还可以使用日志记录做许多其他事情 - 设置自己的日志记录规则、创建日志记录层次结构、创建记录器工厂 - 可能性是无穷无尽的。日志记录应该具有灵活性——例如,允许记录器对象和文件处理程序具有不同且独立的日志记录级别,并让程序员根据需要将它们组合在一起。

我希望小代码练习和我的解释可以消除任何进一步的疑问 - 但如果您仍然需要更多示例,我建议您查看Logging Cookbook文档。



查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信