Python 日志格式化程序

我们使用日志记录来存储有关程序执行的信息。软件运行时会出现各种警告,有时还会出现错误。通过日志记录存储的数据有助于我们确定错误的原因。本文将讨论我们如何使用 Python 中的日志格式化程序以所需的格式存储日志数据。

Python 中有哪些不同的日志记录级别

日志级别用于标识日志文件中警告或消息的严重性。在 Python 中,我们有六个日志记录级别:criticalerrorwarninginfodebug 和 notset。其中 critical 级别具有最高优先级,而 notset 级别具有最低优先级。通常,当我们在程序中创建日志时,日志会打印到标准输出。我们可以使用 logging 模块中的 error() 方法打印 error 日志。如下所示,error() 方法接受一个字符串消息并将其打印到标准输出。

import logging

logging.error('This is a sample error message')

输出:

ERROR:root:This is a sample error message

同样,你可以使用 warning() 方法打印 warning 日志,使用 debug() 方法打印 debug 日志,使用 critical() 方法打印 critical 日志和 info 日志使用 info() 方法,如下所示。

import logging

logging.debug('This is a sample debug message')
logging.info('This is a sample info message')
logging.warning('This is a sample warning message')
logging.error('This is a sample error message')
logging.critical('This is a sample critical message')

输出:

WARNING:root:This is a sample warning message
ERROR:root:This is a sample error message
CRITICAL:root:This is a sample critical message

在输出中,root 是当前记录器的名称。我们还可以使用 getLogger() 方法定义记录器。此外,你可以观察到仅打印了 criticalerror 和 warning 日志,而未打印 debug 和 info 日志。

这是由于日志级别设置为警告级别的原因。任何低于 warning 级别的日志,即 info 和 debug 日志都不会被打印。要打印这些日志,我们必须将日志级别设置为 info。为此,我们使用 logging 模块中定义的 setLevel() 方法。

setLevel() 方法在 logger 对象上调用。logger 对象是使用 logging 模块中定义的 getLogger() 方法创建的。getLogger() 方法将字符串作为输入。该字符串被指定为记录器的名称。将日志级别设置为确定级别后,将打印所有优先级高于该级别的日志。下面的例子展示了它是如何工作的。

import logging

logger = logging.getLogger('myLogger')
logger.setLevel(logging.CRITICAL)
logger.debug('This is a sample debug message')
logger.info('This is a sample info message')
logger.warning('This is a sample warning message')
logger.error('This is a sample error message')
logger.critical('This is a sample critical message')

输出:

This is a sample critical message

在这里,只打印 critical 日志,因为我们已将日志记录级别定义为 critical。此外,你可以看到只打印消息,而不是日志类型和 root 关键字。这是因为我们使用 getLogger() 函数定义了一个名为 myLogger 的自定义记录器。要打印日志类型和记录器名称,我们需要使用 python 日志格式化程序。

什么是 Python 日志处理程序

简单地将消息打印到日志文件将不会产生有关错误的信息。因此,我们需要格式化日志消息以从日志文件中获取所需的信息。为此,我们使用不同的日志格式化程序和处理程序。

你可以将处理程序对象视为将日志消息发送到其特定目的地的通道。有不同类型的处理程序对象,例如 FileHandler 和 StreamHandler 对象。FileHandler 对象是使用 FileHandler() 方法创建的。如下所示,它接受一个文件名作为输入并返回一个 FileHandler 对象。

fileHandler = logging.FileHandler('test_file.log')
logger.addHandler(fileHandler)

类似地,使用 StreamHandler() 方法创建 StreamHandler 对象。FileHandler 对象将日志定向到特定文件,而 StreamHandler 对象将日志定向到特定流。当我们不向 StreamHandler() 方法传递任何输入参数时,它会将日志定向到标准输出流。你可以创建一个 StreamHandler,如下所示。

streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)

创建处理程序对象后,我们使用 addHandler() 方法将处理程序添加到记录器。addHandler() 方法是在 logger 对象上调用的,它将处理程序对象作为输入参数。在执行 addHandler() 方法后,处理程序被添加到 logger

什么是 Python 日志格式化程序

Python 中的日志格式化程序用于配置日志的最终结构和内容。使用 python 日志格式化程序,我们可以使用 % 运算符包括日志名称时间日期严重性和其他信息以及日志消息。

要定义日志的格式,我们使用 Formatter() 方法。Formatter() 方法将包含不同属性的字符串作为输入参数,例如 asctimenamelevelname 等。执行后,Formatter() 方法返回一个 Formatter 对象。

formatter = logging.Formatter('%(asctime)s  %(name)s  %(levelname)s: %(message)s')

这里,

  • asctime 属性表示创建日志记录的时间。
  • name 属性表示用于记录调用的记录器的名称。
  • levelname 属性表示消息的日志记录级别,例如调试、信息、警告、错误或严重。你可以在此处阅读有关其他日志属性的更多信息。

创建 Formatter 对象后,我们使用 setFormatter() 方法设置日志的格式。setFormatter() 方法在处理程序对象上调用。我们使用 StreamHandler 将日志打印到程序的标准输出。在处理程序对象上调用时,setFormatter() 函数将 Formatter 对象作为输入参数,并在处理程序中设置日志格式。

streamHandler.setFormatter(formatter)

设置好日志消息的格式后,就可以像往常一样记录消息,并按照定义的格式发送到输出流。

import logging
logger = logging.getLogger('myLogger')
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
formatter = logging.Formatter('%(asctime)s  %(name)s  %(levelname)s: %(message)s')
streamHandler.setFormatter(formatter)
logger.debug('This is a sample debug message')
logger.info('This is a sample info message')
logger.warning('This is a sample warning message')
logger.error('This is a sample error message')
logger.critical('This is a sample critical message')

输出:

2021-12-28 02:33:42,933  myLogger  WARNING: This is a sample warning message
2021-12-28 02:33:42,933  myLogger  ERROR: This is a sample error message
2021-12-28 02:33:42,933  myLogger  CRITICAL: This is a sample critical message

在这里,你可以看到我们只使用 warning() 方法记录了消息。日志以我们使用 Formatter() 方法定义的格式打印。它包含有关日志的所有详细信息,例如创建日志的日期和时间、记录器的名称和日志类型。现在我们已经分块学习了整个过程,我在下面提到了创建 python 日志格式化程序以格式化日志输出的分步过程。

创建 Python 日志格式化程序的步骤

  • 使用 getLogger() 方法创建一个记录器对象。
  • 使用 FileHandler() 方法或 StreamHandler() 方法创建一个 FileHandler 或 StreamHandler 对象。
  • 使用 addHandler() 方法将 FileHandler 或 StreamHandler 对象添加到记录器。
  • 使用 Formatter() 方法创建一个 python 日志格式化程序。
  • 使用 FileHandler 或 StreamHandler 对象上的 setFormatter() 方法应用格式化程序。

结论

在本文中,我们讨论了日志记录在 Python 中的工作原理。我们还讨论了 Python 中的处理程序和日志格式化程序。在本文中,我们使用 StreamHandler 对象和日志格式化程序来演示格式化的工作原理。但是,你应该始终使用 FileHandler 对象来创建日志,因为我们应该始终将日志存储在文件中,以便在发生任何意外情况时检查错误。此外,你可以使用本文中给出的许多其他日志属性来格式化日志消息以便更好地理解。