小白学 Python
AI 编程指南
© 2026 小白学 Python · 基于 walter201230/Python 教程
课程目录关于本站联系方式隐私政策GitHub

全部课程

  1. 00为什么学 Python
  2. 01Python 安装与第一个程序
  3. 02基本数据类型与变量
  4. 03List 与 Tuple
  5. 04Dict 与 Set
  6. 05条件与循环
  7. 06函数
  8. 07迭代
  9. 08面向对象
  10. 09模块
  11. 10魔法方法
  12. 11枚举类
  13. 12元类 metaclass
  14. 13线程与进程
  15. 14正则表达式
  16. 15闭包
  17. 16装饰器
  18. 17代码可读性
  19. 18pathlib:现代化路径处理
  20. 19异常处理
  21. 20dataclass
  22. 21上下文管理器(with)
  23. 22async / await
  24. 23pyproject.toml + uv
  25. 24ruff:一站式代码检查
  26. 25pytest:测试框架
  27. 26日志 logging
  28. 27打包发布到 PyPI
  29. 28学完之后
Python 环境加载中…

日志 logging

4 道练习题·预计 70 分钟·做对一题解锁下一段

完整通读本章 →

教学 01 / 17· 已读

logging:把 print 调试升级成正经日志

各位写代码的时候,是不是几乎都干过这种事——

代码跑出问题了,怎么办?随手在可疑位置插一行 print('xxx'),再跑一次,看输出在哪儿断掉。然后再插一行 print('yyy'),再跑。最后整个文件里散落着十几个 print('111')、print('here')、print(user),bug 修好之后,要么忘了删,要么删了又怕下次再调试时还得重新插。

本地玩玩还能凑合,可一旦把代码部署到服务器,问题就来了——

「线上挂了,咋回事?」打开服务器一看,啥都没有。print 默认是写到标准输出的,要是程序被 systemd 或者 Docker 拉起来,输出可能根本没人接,或者全混在一起,谁也分不清是哪个时间、哪个模块、哪条业务挂的。

「让我加点日志吧。」于是各位开始改代码,把 print 换成 print(time.strftime('%H:%M:%S'), 'xxx'),再加一段把它写到文件里的逻辑——写完发现,自己在重新发明日志库。

Python 标准库里早就备好了答案,就叫 logging。一行不长的代码,就能让输出自带「时间戳 + 级别 + 模块名 + 进程信息」,还能同时写到控制台、文件、远程服务器,并且可以一键切换「调试时啥都打、上线后只打 ERROR」。

这一章咱们就从最简单的 logging.info('hi') 开始,一路讲到生产环境会怎么用。学完之后,各位应该能:

  1. 写出第一个带时间戳的日志,不再用 print 调试
  2. 知道 5 个日志级别分别该用在什么场景
  3. 用 getLogger(__name__) 给每个模块一个独立的 logger
  4. 用 RotatingFileHandler 防止日志文件无限膨胀
  5. 用 dictConfig + yaml 在生产环境集中管理日志配置
  6. 用 logger.exception() 在 except 里自动带上完整的 traceback
  7. 知道什么时候该上「结构化日志」,什么时候继续用文本日志

走起。

教学 02 / 17

第一个 logger

各位先来感受一下 logging 是怎么个用法。最简单的写法只有两行:

Python· 在本地运行
import logging

logging.info("两点水开始打卡了")

跑一下,奇怪的事情来了——啥都没输出。

这是新手第一次用 logging 几乎都会踩的坑。原因是:logging 默认的级别是 WARNING,比它低的 INFO 和 DEBUG 直接被丢掉了。

各位把上面那行换成 logging.warning('水哥忘了打卡') 再跑:

Python· 在本地运行
import logging

logging.warning("两点水忘了打卡")

终于看到输出:

文本
WARNING:root:两点水忘了打卡

注意这一行的格式:级别 + logger 名字 + 内容,三段式。root 是默认 logger 的名字,后面会讲怎么换。

那 INFO 怎么打出来呢?最简单的办法是先调一行 basicConfig:

Python· 在本地运行
import logging

logging.basicConfig(level=logging.INFO)
logging.info("两点水开始打卡了")

这次看到了:

文本
INFO:root:两点水开始打卡了

basicConfig(level=logging.INFO) 这一行做的事情是「把 root logger 的级别调成 INFO」。一调下来,INFO 及以上(也就是 INFO、WARNING、ERROR、CRITICAL)都会被打出来。

各位这里可能有疑问——「那 DEBUG 怎么打?」很简单,level=logging.DEBUG。DEBUG 是最低级别,调到这里,所有日志都会出来。

「为什么 logging 要默认 WARNING?」官方的解释是:logging 库是给「库的作者」准备的,库要是默认就打一堆 INFO,会污染最终用户的输出。所以默认只打「值得用户注意」的 WARNING 及以上。这个设计哲学理解一下,对后面看库的源码很有帮助。

练习 1 / 4·第一条 log题目有问题?

用 logging.basicConfig 把日志级别调到 INFO,再用 logging.info 打印 '第一条日志'。

注意:starterCode 已经把 logging 配置成输出到 stdout 并使用 format='%(levelname)s:%(message)s' 简化格式,你只需写最后一行 logging.info(...)。

输出应该是:

文本
INFO:第一条日志
main.py
可编辑
🔒做对当前题解锁下一段 ·0/4

推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai

← 上一章25 · pytest:测试框架
日志 logging
下一章 →27 · 打包发布到 PyPI
本章目录

日志 logging

  1. 教学 01logging:把 print 调试升级成正经日志
  2. 教学 02第一个 logger
  3. 练习 1第一条 log
  4. 教学 03 🔒5 个日志级别
  5. 练习 2 🔒5 个日志级别
  6. 教学 04 🔒basicConfig:最简的一行配置
  7. 练习 3 🔒只打 WARNING 及以上
  8. 教学 05 🔒正经做法:getLogger(\_\_name\_\_)
  9. 练习 4 🔒用 getLogger 给 logger 取名字
  10. 教学 06 🔒format 字符串:常用占位符
  11. 教学 07 🔒多个 handler:控制台 + 文件 + 滚动文件
  12. 教学 08 🔒Logger 的层级:getLogger('a.b.c') 的玄机
  13. 教学 09 🔒logger.exception():在 except 里自动带 traceback
  14. 教学 10 🔒配置文件:dictConfig 和 yaml
  15. 教学 11 🔒logging vs print:什么时候用哪个
  16. 教学 12 🔒结构化日志(JSON):让日志能被机器查
  17. 教学 13 🔒小实战:打卡服务的日志配置
  18. 教学 14 🔒几个易踩的坑
  19. 教学 15 🔒FAQ
  20. 教学 16 🔒小结
  21. 教学 17 🔒日志里留下能定位问题的信息

学习目录