Python 的 logging 比 print 更安全,因其分离输出内容与目标、支持分级控制(DEBUG 到 CRITICAL)、多目标输出(文件/邮件/网络等)、线程安全及格式化上下文(时间、模块、行号、线程 ID 等),而 print 仅简单输出至 stdout,无级别、无目标控制、非线程安全、格式不统一。

Python 的 logging 比 print 更安全,核心在于它把“输出什么”和“输出到哪儿、何时输出”彻底分开,支持分级控制、多目标输出、线程安全和运行时动态调整——而 print 只是简单往 stdout 写字符串,一旦上线或并发场景下就容易失控。
支持日志级别控制,避免敏感信息泄露
logging 提供 DEBUG、INFO、WARNING、ERROR、CRITICAL 五级,默认只显示 WARNING 及以上。开发时可设为 DEBUG 查细节,生产环境一键调成 ERROR,自动过滤掉调试用的敏感变量(比如密码、token、完整 traceback)。
print 没有级别概念,所有语句都无差别输出,上线前若漏删调试 print,可能直接把数据库连接串打到控制台或日志文件里。
可配置输出目标,不污染标准输出
logging 允许同时写入多个 handler:文件、syslog、网络服务、甚至自定义目标。你能让 ERROR 日志发邮件,INFO 写进 app.log,调试信息仅输出到终端——互不干扰。
立即学习“Python免费学习笔记(深入)”;
print 固定输出到 sys.stdout,和用户提示、脚本管道、容器日志收集器混在一起,既难过滤,也影响自动化解析(比如 grep "ERROR" 会漏掉没加标签的 print("failed"))。
线程/进程安全,适合真实服务场景
logging 的 handler 默认是线程安全的(如 FileHandler 加锁),多线程写同一个日志文件不会内容错乱。配合 QueueHandler + QueueListener 还能异步落盘,避免阻塞主线程。
print 不是原子操作:两个线程同时 print("A"); print("B"),可能输出 A\nB\nA\nB 或更乱的交错结果,尤其在高并发 Web 服务中极易出现日志拼接错误,排查时根本分不清哪行属于哪个请求。
格式统一、上下文丰富,便于追踪问题
通过 Formatter,一条日志能自动包含时间戳、模块名、函数名、行号、进程/线程 ID、甚至 request ID。例如:
[2024-05-20 14:22:03,128] ERROR in api.py:fetch_user:147 — User 123 not found (pid=1234, tid=1402)
而 print(f"Error: {e} at line {sys._getframe().f_lineno}") 需手动拼、易出错、无法全局统一,且拿不到线程 ID 等关键上下文。










