3. logging模块基础
调试代码,很多人第一反应就是 print()。说实话,我早年也是这么干的。但项目一复杂,print 的弊端就出来了——上线前得一个个删,删漏了还容易出事故。后来我改用 logging,嗯,真香。
3.1 logging 是什么?
logging 是 Python 自带的日志模块。说白了,它就是个比 print 更专业的“记录员”。你告诉它要记什么、怎么记、记到哪里去,它都能帮你搞定。
我个人习惯把 logging 比作“带等级的 print”。为什么这么说?因为 logging 不光能输出信息,还能给信息打上“严重程度”的标签。这样你在排查问题时,可以快速过滤掉无关紧要的日志,直奔关键错误。
核心优势:
- 自带时间戳、模块名、行号等信息
- 可以同时输出到控制台和文件
- 支持日志分级,按需过滤
- 不需要手动删除,上线后也能保留
3.2 日志级别:五个等级,够用
logging 定义了五个级别,从低到高分别是:
| 级别 | 数值 | 什么时候用? |
|---|---|---|
| DEBUG | 10 | 调试信息,比如变量值、函数入口 |
| INFO | 20 | 正常流程信息,比如“服务启动成功” |
| WARNING | 30 | 警告,程序还能跑,但需要注意 |
| ERROR | 40 | 错误,某个功能挂了,但程序没崩溃 |
| CRITICAL | 50 | 严重错误,程序可能撑不住了 |
为什么会这样设计?你想想看,开发时你可能想看所有 DEBUG 信息,但上线后你只关心 ERROR 和 CRITICAL。logging 通过设置级别,就能轻松做到这一点。
我的经验: 我在项目中遇到过一位同事,把所有日志都写成 INFO。结果日志文件一天就涨到几个 G,排查问题反而更困难。记住:级别不是摆设,该用 DEBUG 就用 DEBUG。
3.3 基本配置:三行代码搞定
配置 logging 其实很简单。最常用的就是 basicConfig() 方法。来看个例子:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.debug("这是一条调试信息")
logging.info("程序正常运行")
logging.warning("磁盘空间不足")
logging.error("数据库连接失败")
logging.critical("系统即将崩溃")
运行后,控制台会输出类似这样的内容:
2024-01-15 10:30:25,123 - DEBUG - 这是一条调试信息
2024-01-15 10:30:25,123 - INFO - 程序正常运行
2024-01-15 10:30:25,123 - WARNING - 磁盘空间不足
2024-01-15 10:30:25,123 - ERROR - 数据库连接失败
2024-01-15 10:30:25,123 - CRITICAL - 系统即将崩溃
注意看,level=logging.DEBUG 表示所有级别 >= DEBUG 的日志都会输出。如果你改成 level=logging.WARNING,那 DEBUG 和 INFO 就不会显示了。
避坑指南: 我曾经在同一个脚本里调用了两次 basicConfig(),结果第二次配置完全没生效。后来查文档才发现,basicConfig() 只能调用一次,后续调用会被忽略。如果你需要动态修改配置,建议用 logger.setLevel() 的方式。
3.4 输出到控制台:默认行为
其实,logging 默认就会输出到控制台。你什么都不配,直接写 logging.warning("test") 也能看到输出。但默认只显示 WARNING 及以上级别的日志。
我个人习惯在开发阶段把级别设为 DEBUG,这样所有信息都能看到。上线前再改成 INFO 或 WARNING,避免刷屏。
# 开发环境
logging.basicConfig(level=logging.DEBUG)
# 生产环境
logging.basicConfig(level=logging.WARNING)
你可能会问:能不能同时输出到控制台和文件?当然可以,但那是后面章节的内容了。现在先把控制台玩明白。
3.5 知识体系总览
下面这张图,是我梳理的 logging 模块核心知识结构。你可以把它当作本章的“地图”:
这张图把本章的核心内容串起来了。你从中间开始看,左边是日志级别,中间是配置方法,右边是输出目标。记住这个结构,后面学 Handler、Formatter 时就不会迷路。
小技巧: 刚开始用 logging 时,我建议你直接复制上面的代码跑一遍。亲眼看到 DEBUG、INFO、WARNING 在控制台里按级别显示,比看十遍文档都管用。
好了,logging 的基础就这些。别觉得简单,基础打牢了,后面学高级玩法才不费劲。记住:用 logging 替代 print,是你从“野路子”走向“正规军”的第一步。
可可精品资料库