Python 日志格式化程序
我们使用日志记录来存储有关程序执行的信息。软件运行时会出现各种警告,有时还会出现错误。通过日志记录存储的数据有助于我们确定错误的原因。本文将讨论我们如何使用 Python 中的日志格式化程序以所需的格式存储日志数据。
Python 中有哪些不同的日志记录级别
日志级别用于标识日志文件中警告或消息的严重性。在 Python 中,我们有六个日志记录级别:critical
、error
、warning
、info
、debug
和 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()
方法定义记录器。此外,你可以观察到仅打印了 critical
、error
和 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()
方法将包含不同属性的字符串作为输入参数,例如 asctime
、name
、levelname
等。执行后,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
对象来创建日志,因为我们应该始终将日志存储在文件中,以便在发生任何意外情况时检查错误。此外,你可以使用本文中给出的许多其他日志属性来格式化日志消息以便更好地理解。
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub