欢迎光临
我们一直在努力

logging 日志模块完全指南 —— 从基础到多处理器配置

前言

在开发 Python 项目时,日志记录是不可或缺的一环。相比 print,logging 模块提供了分级输出、多目标输出(控制台、文件)、格式化等强大功能。本文将从零开始,结合实战代码,带你彻底掌握 logging 的使用。

1. 日志级别与数值

Python 日志定义了以下标准级别(数值越高越严重):

级别数值适用场景
DEBUG 10 详细调试信息
INFO 20 常规运行信息
WARNING 30 警告,程序仍可运行
ERROR 40 错误,部分功能失效
CRITICAL 50 致命错误,程序可能崩溃

关键点:logger.setLevel(level) 会过滤掉低于该级别的所有日志。每个处理器也可以独立设置级别,实现精细化控制。

2. 核心组件

  • Logger:日志记录器,应用程序直接调用。

  • Handler:处理器,决定日志输出到哪里(控制台、文件、网络等)。

  • Formatter:格式化器,定义日志的显示样式。

3. 实战:同时输出到控制台和文件(基于你的 62.logging基础.py)

import logging

# 1. 创建 Logger
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG) # 全局总开关

# 2. 控制台处理器(StreamHandler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 只输出 INFO 及以上
console_formatter = logging.Formatter(
'%(asctime)s – %(name)s – %(levelname)s – %(message)s'
)
console_handler.setFormatter(console_formatter)

# 3. 文件处理器(FileHandler)
file_handler = logging.FileHandler("app.log", encoding='utf-8')
file_handler.setLevel(logging.WARNING) # 只记录 WARNING 及以上
file_formatter = logging.Formatter(
'%(asctime)s – %(filename)s:%(lineno)d – %(levelname)s – %(message)s'
)
file_handler.setFormatter(file_formatter)

# 4. 添加处理器到 Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 5. 测试
logger.debug("调试信息(不会出现在控制台和文件)")
logger.info("普通信息(控制台可见,文件不可见)")
logger.warning("警告(控制台和文件都记录)")
logger.error("错误(控制台和文件都记录)")
logger.critical("严重错误(控制台和文件都记录)")

运行结果

  • 控制台输出(仅 INFO、WARNING、ERROR、CRITICAL):

text

2025-03-30 12:00:00 – my_app – INFO – 普通信息(控制台可见,文件不可见)
2025-03-30 12:00:01 – my_app – WARNING – 警告(控制台和文件都记录)
2025-03-30 12:00:02 – my_app – ERROR – 错误(控制台和文件都记录)
2025-03-30 12:00:03 – my_app – CRITICAL – 严重错误(控制台和文件都记录)

  • 文件 app.log 内容:

2025-03-30 12:00:01 – 62.logging基础.py:35 – WARNING – 警告(控制台和文件都记录)
2025-03-30 12:00:02 – 62.logging基础.py:36 – ERROR – 错误(控制台和文件都记录)
2025-03-30 12:00:03 – 62.logging基础.py:37 – CRITICAL – 严重错误(控制台和文件都记录)

4. 多 Logger 实例

实际项目中,可以为不同模块创建独立的 Logger,每个可拥有不同的处理器和级别。如下创建 用户模块 专用日志:

logger2 = logging.getLogger("用户模块")
logger2.setLevel(logging.DEBUG)
file_handler2 = logging.FileHandler('user.log', encoding='utf-8')
file_handler2.setLevel(logging.WARNING)
file_formatter2 = logging.Formatter('%(asctime)s – %(levelname)s – %(name)s – %(message)s')
file_handler2.setFormatter(file_formatter2)
logger2.addHandler(file_handler2)

logger2.warning("用户登录失败")

5. 进阶技巧

  • 使用 basicConfig 快速配置:适合简单脚本。

  • 日志轮转:使用 RotatingFileHandler 或 TimedRotatingFileHandler 防止日志过大。

  • 配置文件:通过 logging.config.dictConfig 将配置写在 YAML/JSON 中,便于运维。

总结

logging 模块灵活而强大,掌握 Logger、Handler、Formatter 三者的组合,你可以轻松构建生产级别的日志系统。建议在实际项目中尽早引入日志,避免后期用 print 填坑。

赞(0)
未经允许不得转载:171主机测评 » logging 日志模块完全指南 —— 从基础到多处理器配置
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址