前言
在开发 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 填坑。



