打印调试适合快速验证,用print()输出变量或流程;日志调试用logging模块,支持分级、多目标输出,适合中大型项目和生产环境;二者可共存,应按阶段、协作和环境选择。

打印调试:简单直接,适合快速验证
用 print() 输出变量值或执行流程,是新手最常用的调试方式。它启动快、无需配置,适合单次运行、逻辑简单的脚本。
常见用法包括:
- 在关键位置插入
print("step1", var)查看变量当前状态 - 用
print(f"debug: {x=}")(Python 3.8+)自动显示变量名和值 - 临时加
print("→ entering func")跟踪函数调用顺序
缺点也很明显:容易遗漏清理,上线后留下大量 print;无法分级控制输出;多线程下输出可能错乱;不支持写入文件或远程发送。
日志调试:结构化、可配置,适合持续维护
Python 标准库的 logging 模块提供级别控制(DEBUG/INFO/WARNING/ERROR/CRITICAL)、格式化、输出目标(控制台、文件、网络)等能力,适合中大型项目或需要长期观察的场景。
立即学习“Python免费学习笔记(深入)”;
典型用法:
- 初始化一次:
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s") - 在代码中使用:
logging.debug("x=%s, y=%s", x, y)(延迟格式化,更高效) - 不同模块可获取独立 logger:
logger = logging.getLogger(__name__),便于分类过滤
优势在于:可随时关闭 DEBUG 日志而不删代码;能按模块、级别、时间筛选;支持轮转文件避免磁盘占满;与生产监控系统(如 ELK、Sentry)集成方便。
什么时候该选哪个?
判断依据不是“高级 vs 简单”,而是调试阶段、协作需求和运行环境:
- 刚写完一行逻辑,想立刻看结果 → 用
print() - 要复现一个偶发 bug,需长时间运行并保留现场 → 用
logging并输出到文件 - 多人协作开发,需统一查看某模块行为 → 配置 logger 名称和级别,避免 print 冲突
- 部署到服务器后仍需观察行为 → 必须用 logging,print 会丢失或混入 stdout/stderr 不易捕获
可以共存,但要有意识地切换
实际开发中不必非此即彼。建议:
- 日常编码用 print 快速探路,提交前删掉或转成 logging.debug
- 把常用 debug 打印封装成函数,例如
def dbg(*a): logging.debug("DBG "+str(a)),便于后期批量关闭 - 在 main 或入口处统一设置 logging 级别,开发时设为 DEBUG,上线改为 WARNING
关键是把调试信息当成代码的一部分来管理,而不是临时涂鸦。











