Python 文件处理程序的日志级别与记录器的日志级别
要在不使用Python 文件处理程序的日志级别与记录器的日志级别,python,logging,Python,Logging,要在不使用basicConfig的情况下在Python中设置日志记录,我们将执行以下步骤: 设置一个文件处理程序 设置文件处理程序的日志记录级别 设置格式化程序 将文件处理程序指向格式化程序 获取记录器对象 设置记录器对象的日志记录级别 将文件处理程序作为处理程序添加到记录器对象 在记录器上使用.info()、.warning()等方法 这些步骤由以下代码执行: import logging file_handler = logging.FileHandler('./out.log', 'a'
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)
有两个记录器-foo\u logger
设置为信息级别,而nameless\u logger
设置为调试级别。它们都使用错误和调试处理程序,但是只有foo\u记录器
使用foo\u文件处理程序
。现在有不同级别的记录器和文件处理程序,以多对多关系连接在一起
您可以发现:
错误。日志将包含来自两个记录器的错误。对于真实场景来说,这是不言自明的——读取只包含错误的日志有助于调试代码
Foo.log
和nameless.log
将包含关于这些记录器的所有可能信息,并考虑其级别。因此,前者将包含信息和更高级别,而后者将跟踪调试和更高级别。每个对象的日志记录可能会创建大量文件,但在尝试检测某些特定于对象的错误时,这可能是至关重要的foo_info
是一个非常特殊的文件处理程序,它只允许从相关记录器获取信息级别。当您进入一个潜在的不安全或未测试的代码区域,并且希望查看该代码块中到底发生了什么,而不必浏览所有程序日志时,这样的文件可以起到救生作用我希望小代码练习和我的解释能够消除任何进一步的疑问-但是如果您还需要更多的示例,我建议您查看或查看。这看起来很像一个家庭作业或面试问题。关于您的编辑-一个文件处理程序可以被许多日志记录者使用,因此可以设置不同的级别。例如,如果您将文件处理程序设置为仅接受
logger.ERROR
,但希望任何记录器使用该文件(假设它是全局错误日志),则可以让每个记录器使用其自己的日志级别,同时将所有错误重定向到该文件。你想让我把这作为一个答案并加上一个例子吗?@Kacperflorianski让我问第二个问题,因为你(还)告诉了我一些我不知道的事情。@Kacperflorianski,如果可能的话,你能加上你的评论作为这个问题的答案吗,在对象图上?明天我将深入查看,但乍一看它在逻辑上是正确的。从技术上讲,文件处理程序可以指向同一个文件(但通常不会这样做),我认为Python日志只提供4个级别(调试、信息、警告和错误)。我将在这里发布一个例子,希望能回答你的第三个问题。