小白学 Python
课程GitHub
© 2026 小白学 Python · 基于 walter201230/Python 教程
课程目录GitHub
Python 环境加载中…
日志 logging0 / 4
1234

日志 logging

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

教学 01 / 05· 已读

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

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

代码跑出问题了,怎么办?随手在可疑位置插一行 print('xxx'),再跑一次。然后再插一行 print('yyy'),再跑。最后整个文件里散落着十几个 print('111')、print('here')、print(user),bug 修好之后忘了删。

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

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

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

这一节就从最简单的 logging.info('hi') 开始。

教学 03 / 05

一、第一个 logger

最简单的写法只有两行:

python
import logging

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

跑一下——啥都没输出。

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

把上面那行换成 logging.warning(...) 再跑:

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

终于看到输出:

WARNING:root:两点水忘了打卡

注意这一行的格式:级别 + logger 名字 + 内容,三段式。root 是默认 logger 的名字。

basicConfig:最简的一行配置

要让 INFO 也打出来,先调一行 basicConfig:

python
import logging

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

输出:

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

basicConfig(level=logging.INFO) 把 root logger 的级别调成 INFO——INFO 及以上都会被打出来。

⚠️ 「为什么默认是 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
本章目录

日志 logging

  1. 教学 01logging:把 print 调试升级成正经日志
  2. 教学 03一、第一个 logger
  3. 练习 1第一条 log
  4. 教学 02二、5 个日志级别
  5. 练习 2 🔒5 个日志级别
  6. 练习 3 🔒只打 WARNING 及以上
  7. 教学 04三、自定义日志格式
  8. 教学 05四、正经做法:getLogger(__name__)
  9. 练习 4 🔒用 getLogger 给 logger 取名字
← 上一章25 · pytest:测试框架
日志 logging
下一章 →27 · 打包发布到 PyPI