共计 2442 个字符,预计需要花费 7 分钟才能阅读完成。
在程序开发中,打印调试信息是最常见的排错方式之一,但随着项目复杂度提升,仅靠 print() 已经不够用了。此时,Python 内置的 logging 模块 就显得非常重要。它能让我们更系统地记录程序运行状态、错误信息和执行流程。
一、为什么使用 logging
相比 print(),logging 具备以下优势:
- 可以输出到控制台、文件或远程服务器;
- 可以设置不同的日志级别(如调试、警告、错误等);
- 可灵活控制日志格式、时间、模块名等信息;
- 可随时启用或关闭日志输出,而不影响主程序逻辑。
二、logging 模块的基础使用
import logging
# 配置基本日志输出
logging.basicConfig(level=logging.INFO)
logging.debug(" 这是调试信息 ")
logging.info(" 程序开始执行 ")
logging.warning(" 这是一个警告 ")
logging.error(" 发生错误!")
logging.critical(" 严重错误!程序即将退出 ")
执行后输出示例:
INFO:root: 程序开始执行
WARNING:root: 这是一个警告
ERROR:root: 发生错误!CRITICAL:root: 严重错误!程序即将退出
因为我们设置了 level=logging.INFO,所以 DEBUG 信息不会被打印出来。
三、日志级别说明
| 等级 | 常量 | 用途 |
|---|---|---|
| DEBUG | logging.DEBUG | 详细信息,一般用于调试 |
| INFO | logging.INFO | 程序运行过程的普通信息 |
| WARNING | logging.WARNING | 程序中出现潜在问题 |
| ERROR | logging.ERROR | 程序运行中出现错误 |
| CRITICAL | logging.CRITICAL | 严重错误,程序可能无法继续运行 |
四、日志输出到文件
如果希望日志写入文件,可以通过 filename 参数实现:
logging.basicConfig(
filename="app.log",
level=logging.DEBUG,
format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info(" 开始记录日志 ")
logging.error(" 发生错误,正在写入文件 ")
此时所有日志信息将保存到 app.log 文件中,格式类似:
2025-10-14 15:32:10,456 - INFO - 开始记录日志
2025-10-14 15:32:10,457 - ERROR - 发生错误,正在写入文件
五、自定义日志对象
在大型项目中,通常不直接使用 basicConfig,而是创建自己的 Logger 对象:
import logging
logger = logging.getLogger("MyApp")
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建文件处理器
file_handler = logging.FileHandler("myapp.log")
file_handler.setLevel(logging.ERROR)
# 定义日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加到 logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 输出日志
logger.debug(" 调试模式信息 ")
logger.info(" 启动应用 ")
logger.error(" 发生错误,写入文件 ")
这样一来:
- 控制台会输出
INFO及以上的日志; - 文件中则只会保存
ERROR及以上级别的日志。
六、按日期分割日志文件
当程序长期运行时,日志文件可能会非常大。我们可以使用 TimedRotatingFileHandler 自动按日期分割:
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger("AppLogger")
handler = TimedRotatingFileHandler("timelog.log", when="midnight", interval=1, backupCount=7)
handler.suffix = "%Y-%m-%d.log"
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info(" 程序启动 ")
这会每天创建一个新的日志文件,并自动保留最近 7 天的记录。
七、实际应用技巧
- 开发阶段:设置日志级别为
DEBUG,方便查看细节。 - 生产环境:设置为
WARNING或更高,避免输出过多信息。 - 统一日志格式:推荐包含时间、模块名、级别、信息四个要素。
- 集中管理:大型系统中可使用 ELK(Elasticsearch + Logstash + Kibana)统一分析日志。
八、小结
logging 模块是 Python 中最实用的调试与监控工具之一。
掌握其使用后,你可以在项目中轻松实现:
- 控制台与文件日志分流
- 动态日志级别控制
- 自动切割日志文件
- 精确记录错误堆栈与运行过程
下一节我们将学习如何将 logging 与异常捕获 (try...except) 结合,实现 自动错误记录机制,让程序更稳定可控。