Python 简明教程

Python - Logging

Logging in Python

日志记录是在程序执行期间记录消息的过程,以便提供运行时信息,这些信息对于监视、调试与审核非常有用。

在 Python 中,日志记录通过内置 logging 模块实现,该模块提供了一个灵活的框架,用于生成日志消息。

Benefits of Logging

以下是使用 Python 进行日志记录的一些好处−

  1. Debugging − 有助于通过在程序执行期间捕获相关信息,识别和诊断问题。

  2. Monitoring − 提供了对应用程序行为和性能的见解。

  3. Auditing − 出于安全目的记录重要事件和操作。

  4. Troubleshooting − 便于跟踪程序流程和变量值,以理解意外行为。

Components of Python Logging

Python 日志记录包含几个主要组件,协同工作以有效地管理和输出日志消息 −

  1. Logger − 它是用来发出日志消息的主要入口点。每个记录器实例都具有名称,可以独立配置。

  2. Handler − 确定日志消息的发送位置。处理程序将日志消息发送到不同的目标,例如控制台、文件、端口等。

  3. Formatter − 指定日志消息的布局。格式化程序通过指定要包含哪些信息(例如,时间戳、日志级别、消息)来定义日志记录的结构。

  4. Logger Level − 定义日志消息的严重性级别。低于此级别的消息将被忽略。常见级别包括 DEBUG、INFO、WARNING、ERROR 和 CRITICAL。

  5. Filter − 可选组件可以更精细地控制由处理器处理和发出的日志记录。

Logging Levels

Python 中的日志级别定义了日志消息的严重性,允许开发者根据重要性对消息进行分类和筛选。每个日志级别都有特定的用途,并且有助于理解已记录信息的重要性 −

  1. DEBUG − 详细信息,通常仅对调试目的有用。这些消息用于跟踪程序的流,并且通常在生产环境中看不到。

  2. INFO − 确认工作照常。这些消息提供有关应用程序进度的常规信息。

  3. WARNING − 指出潜在的问题,这些问题不会阻止程序运行,但可能需要引起注意。这些消息可用于向开发人员发出关于意外情况的警报。

  4. ERROR − 指出更严重的问题,该问题会阻止特定函数或操作成功完成。这些消息会突出显示需要立即注意但未必会终止应用程序的错误。

  5. CRITICAL − 最严重的级别,指出可能导致程序终止的关键错误。这些消息仅用于需要立即干预的关键失败情况。

Usage

以下是 Python 应用程序中每个日志级别的使用场景 −

Choosing the Right Level − 选择适当的日志级别可确保日志消息提供相关信息,而不会使日志混乱。

Setting Levels − 可以使用不同的级别来配置记录器、处理器和特定的日志消息,以控制记录哪些消息以及输出到哪里。

Hierarchy − 日志级别是分层的,这意味着在一个记录器上设置一个级别也会影响关联的处理器和日志消息。

Basic Logging Example

以下是一个在 Python 中的基本日志记录示例,展示了它的用法和功能 −

import logging

# Configure logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# Example usage
def calculate_sum(a, b):
   logging.debug(f"Calculating sum of {a} and {b}")
   result = a + b
   logging.info(f"Sum calculated successfully: {result}")
   return result

# Main program
if __name__ == "__main__":
   logging.info("Starting the program")
   result = calculate_sum(10, 20)
   logging.info("Program completed")

Output

以下是上面代码的输出: -

2024-06-19 09:00:06,774 - INFO - Starting the program
2024-06-19 09:00:06,774 - DEBUG - Calculating sum of 10 and 20
2024-06-19 09:00:06,774 - INFO - Sum calculated successfully: 30
2024-06-19 09:00:06,775 - INFO - Program completed

Configuring Logging

在 Python 中配置日志记录是指设置记录器、处理器和格式化程序等各种组件,以控制日志消息如何以及在哪里存储和显示。此配置允许开发者根据应用程序的要求和部署环境来自定义日志记录行为。

Example

在以下示例中,getLogger() 函数会检索或创建一个具名的记录器。记录器根据它们的名称按层次组织。然后,创建诸如 "StreamHandler"(控制台处理器)之类的处理器,以定义日志消息的去向。它们可以用特定的日志级别和格式化程序进行配置。

格式化程序指定日志记录的布局,决定日志消息在打印或存储时如何显示 −

import logging

# Create logger
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)  # Set global log level

# Create console handler and set level to debug
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# Create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)

# Add console handler to logger
logger.addHandler(console_handler)

# Example usage
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

生成的结果如下所示 −

2024-06-19 09:05:20,852 - my_app - DEBUG - This is a debug message
2024-06-19 09:05:20,852 - my_app - INFO - This is an info message
2024-06-19 09:05:20,852 - my_app - WARNING - This is a warning message
2024-06-19 09:05:20,852 - my_app - ERROR - This is an error message
2024-06-19 09:05:20,852 - my_app - CRITICAL - This is a critical message

Logging Handlers

Python 中的日志记录处理器决定日志消息如何以及在哪里处理和输出。它们在将日志消息定向到特定目的地(例如控制台、文件、电子邮件、数据库甚至远程服务器)方面发挥着重要作用。

可以独立配置每个处理器,以控制它处理的消息的格式、日志级别和其他属性。

Types of Logging Handlers

以下是 Python 中各种类型的日志记录处理器 −

  1. StreamHandler − 将日志消息发送到诸如 sys.stdout 或 sys.stderr 之类的流中。对于在控制台或命令行界面中显示日志消息非常有用。

  2. FileHandler − 将日志消息写入文件系统上的指定文件。有助于持久记录日志和存档日志数据。

  3. RotatingFileHandler − 与 FileHandler 类似,但会根据大小或时间间隔自动轮换日志文件。有助于管理日志文件大小并防止它们变得过大。

  4. SMTPHandler − 通过 SMTP 将日志消息作为电子邮件发送给指定的收件人。有助于向管理员或开发人员发出有关严重问题的警报。

  5. SysLogHandler − 将日志消息发送到类 Unix 系统(例如,syslog)上的系统日志。允许与系统范围内的日志记录工具集成。

  6. MemoryHandler − 在内存中缓冲日志消息,并在达到特定缓冲区大小或超时后将它们发送到目标处理程序。有助于批处理和管理日志消息的突发。

  7. HTTPHandler − 通过 HTTP 或 HTTPS 将日志消息发送到 Web 服务器。允许将消息记录到远程服务器或日志记录服务。