编程学习网 > 编程语言 > Python > 你还在用 print 调试?Python logging 模块才是正经工具
2026
08-22

你还在用 print 调试?Python logging 模块才是正经工具


同事小马最近接了个数据处理的需求,写了个脚本,跑得挺顺。上线第一天,线上报了个错,他赶紧加了一堆 print 看问题在哪。

结果第二天上线,日志文件里全是这种输出,真正出错的那行反而被淹没了。

更要命的是,他想关掉这些调试信息,发现得一个一个手动删。

这就是 print 调试的终极问题:调试信息和业务日志混在一起,想关关不掉,想找找不到。

1. logging 模块:Python 自带的日志系统

logging 模块是 Python 标准库自带的,零依赖,不用装。

它解决的核心问题是:让程序的输出分级别、分去向、可控制。

几个关键概念:

Logger:日志的入口,你调 logging.info() 实际上是在调 logger 的方法

Handler:日志往哪送,控制台、文件、网络都行

Formatter:日志长什么样,时间、级别、模块名都可以自定义

Level:日志的紧急程度,DEBUG < INFO < WARNING < ERROR < CRITICAL

print 比,logging 的区别在哪里?

维度

print

logging

级别区分

没有,全混在一起

5 级,按紧急程度过滤

输出去向

只能打控制台

控制台、文件、网络、邮件都行

运行时控制

要改代码删 print

改配置就行,不碰业务代码

格式化

自己拼字符串

内置模板,时间/线程/模块名自动带

 

2. print logging 的三步迁移

第一步:导包与基础设置

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s')
logging.info('程序启动')logging.warning('配置文件不存在,使用默认值')logging.error('数据库连接失败')

输出:

2026-08-19 10:30:01 [INFO] 程序启动2026-08-19 10:30:01 [WARNING] 配置文件不存在,使用默认值2026-08-19 10:30:01 [ERROR] 数据库连接失败

第二步:输出到文件

import logging
logging.basicConfig(    level=logging.DEBUG,    format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',    handlers=[        logging.FileHandler('app.log', encoding='utf-8'),        logging.StreamHandler()    ])

第三步:按模块分 logger(生产推荐)

import logging
logger = logging.getLogger(__name__)
def process_data(data):    logger.info('收到 %d 条数据', len(data))    try:        result = transform(data)        logger.info('处理完成,输出 %d ', len(result))        return result    except Exception as e:        logger.error('处理失败: %s', e, exc_info=True)        raise

exc_info=True 会把完整的错误堆栈打出来,比 print print(e) 强太多了。

3. logging 的设计思想

logging 的核心设计思路是关注点分离:

业务代码只管说发生了什么,不管输出到哪

配置层决定日志去控制台还是文件、输出什么格式

运行时通过调整 level 过滤不需要的信息

这意味着:开发环境设 DEBUG 看详细日志,生产环境切 INFO 只看关键信息,业务代码一行不用改。

还有一个容易被忽略的设计:logger 是层级的。

logging.getLogger('app.db') logging.getLogger('app') 的子 logger

你可以给 app 设一个级别,单独给 app.db 设另一个级别,精细控制每个模块的日志量。

4. 常见问题

basicConfig 调了两次不生效?

是的,basicConfig 只在第一次调用时生效。第二次调用会被忽略。所以一般在程序入口调一次就够了,别到处写。

logging print 混着用会乱吗?

会。

print 输出没有时间戳和级别,跟 logging 的输出混在一起很难看。要么全用 logging,要么至少在生产代码里把 print 换掉。

多线程环境下 logging 安全吗?

安全。

logging 内部做了锁,多线程同时写日志不会交错。print 在多线程下反而可能输出交错。

print 换成 logging,是每个Python开发者从脚本走向工程的第一步。配置三行代码,换来的是可控制、可追溯、可搜索的日志体系。

以上就是“你还在用 print 调试?Python logging 模块才是正经工具的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。 

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取