Python logging 模块:从入门到精通的权威指南

高手们在线讲解下,Python logging 模块:从入门到精通的权威指南
最新回答
有你委屈也是欢乐的

2026-06-30 00:23:22

Python logging 模块:从入门到精通的权威指南

引言

日志记录是软件开发中至关重要的环节,它能够记录应用程序事件、错误和调试信息,帮助开发者快速定位问题并优化性能。Python 的 logging 模块提供了一个灵活且强大的框架,支持不同严重程度的日志消息,并可将日志输出到多种目的地(如控制台、文件、邮件等)。本文将系统介绍 logging 模块的核心功能、配置方法及最佳实践,助您从入门到精通。

1. 安装与基础配置1.1 安装

logging 是 Python 标准库的一部分,无需额外安装。若需扩展功能(如第三方日志处理器),可通过 pip 安装:

pip install logging1.2 基础配置

可通过代码直接配置,或使用配置文件(如 logging.conf)。以下为代码配置示例:

import logging# 创建 Logger 对象logger = logging.getLogger(__name__)logger.setLevel(logging.DEBUG) # 设置日志级别# 创建控制台处理器console_handler = logging.StreamHandler()console_handler.setLevel(logging.INFO)# 创建文件处理器file_handler = logging.FileHandler("app.log")file_handler.setLevel(logging.DEBUG)# 设置日志格式formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")console_handler.setFormatter(formatter)file_handler.setFormatter(formatter)# 添加处理器到 Loggerlogger.addHandler(console_handler)logger.addHandler(file_handler)2. 日志级别

logging 模块定义了五个标准级别(从低到高):

  • DEBUG:调试细节(开发阶段使用)。
  • INFO:确认程序按预期运行。
  • WARNING:表明潜在问题(如配置错误)。
  • ERROR:严重问题,程序部分功能失效。
  • CRITICAL:致命错误,程序可能崩溃。

使用示例

logger.debug("调试信息") # 仅在 DEBUG 级别下记录logger.warning("警告:磁盘空间不足")logger.error("错误:文件未找到")3. 核心组件3.1 Logger(日志器)
  • 通过 logging.getLogger(name) 创建,name 用于标识日志来源(通常用 __name__)。
  • 关键方法:debug(), info(), warning(), error(), critical()。
3.2 Handler(处理器)

将日志发送到不同目的地,常用内置处理器:

  • StreamHandler:输出到控制台(如 sys.stdout)。
  • FileHandler:写入文件。
  • SMTPHandler:通过邮件发送日志。
  • RotatingFileHandler:按大小或时间轮转日志文件。

示例

from logging.handlers import RotatingFileHandlerrotating_handler = RotatingFileHandler( "app.log", maxBytes=1024, backupCount=3)3.3 Formatter(格式器)

自定义日志格式,常用字段:

  • %(asctime)s:时间戳。
  • %(levelname)s:日志级别。
  • %(message)s:日志内容。
  • %(name)s:Logger 名称。

示例

formatter = logging.Formatter( "%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")4. 高级功能4.1 过滤器(Filter)

通过自定义过滤器控制日志输出(如仅记录特定模块的日志):

class MyFilter(logging.Filter): def filter(self, record): return "sensitive" not in record.getMessage()logger.addFilter(MyFilter())4.2 异常捕获

使用 exc_info 参数记录异常堆栈:

try: 1 / 0except Exception: logger.error("发生异常", exc_info=True)4.3 处理器链

多个处理器可协同工作(如同时输出到控制台和文件):

logger.addHandler(console_handler)logger.addHandler(file_handler)5. 最佳实践
  1. 合理选择日志级别:避免过度使用 DEBUG 或遗漏关键 ERROR。
  2. 模块化 Logger:为不同模块创建独立 Logger(如 logging.getLogger("module.submodule"))。
  3. 敏感信息过滤:使用 Filter 屏蔽密码等敏感数据。
  4. 日志轮转:对大文件使用 RotatingFileHandler 或 TimedRotatingFileHandler。
  5. 结构化日志:输出 JSON 格式便于日志分析(需自定义 Formatter)。
6. 完整示例import loggingfrom logging.handlers import RotatingFileHandler# 配置 Loggerlogger = logging.getLogger("my_app")logger.setLevel(logging.DEBUG)# 控制台处理器console = logging.StreamHandler()console.setLevel(logging.INFO)# 文件处理器(轮转)file_handler = RotatingFileHandler( "app.log", maxBytes=1024*1024, backupCount=5)file_handler.setLevel(logging.DEBUG)# 格式器formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s")console.setFormatter(formatter)file_handler.setFormatter(formatter)# 添加处理器logger.addHandler(console)logger.addHandler(file_handler)# 记录日志logger.info("应用程序启动")try: result = 1 / 0except ZeroDivisionError: logger.error("除零错误", exc_info=True)结论

Python 的 logging 模块通过分层设计(Logger-Handler-Formatter)实现了灵活的日志管理。掌握其核心功能(级别、处理器、格式)和高级技巧(过滤器、异常捕获)后,您能够高效地记录、分析和调试应用程序日志,显著提升开发效率和系统可维护性。建议结合实际项目需求,逐步优化日志策略。