结论:别用print(),从第一天起就配好logging.basicconfig()或getlogger()+handler,否则日志会乱、漏、难查;print无级别、无时间戳、无模块名、不落盘,仅适用于临时调试,生产环境必须用logging统一管理。

直接说结论:别用 print(),从第一天起就配好 logging.basicConfig() 或 logging.getLogger() + Handler,否则日志会乱、漏、难查,后期补救成本远超初期五分钟配置。
为什么 print() 不是日志,只是临时调试输出
运行时看不到 print() 输出(比如后台服务、Docker 容器)、无法按级别过滤(INFO/WARNING/ERROR 分不开)、不能自动写入文件、时间戳和模块名全靠手拼——出问题时你根本不知道哪条日志来自哪个模块、哪一秒发生的。
实操建议:
- 删掉所有用于“留痕”的
print("start processing...")类语句,换成logger.info("start processing...") - 把脚本开头的
print("Loading config...")改成logging.info("Loading config...")前,先确保已调用logging.basicConfig() - 不手动拼接时间或文件名,
%(asctime)s和%(name)s格式符会自动填好
新手最该用的初始化方式:basicConfig() 的三个必设参数
90% 的入门场景用 logging.basicConfig() 足够,但只写 level=logging.INFO 是不够的——你会看到日志没颜色、没时间、没来源,甚至写不进文件。
必须显式指定:
-
level:最低记录级别,推荐从logging.INFO开始(DEBUG太吵,WARNING会漏掉关键流程日志) -
format:至少包含%(asctime)s %(name)s %(levelname)s %(message)s;想定位快就加%(filename)s:%(lineno)d -
handlers:明确指定输出去哪,例如[logging.StreamHandler(), logging.FileHandler("app.log")]——不传这个,默认只打到终端,重启后日志就丢了
示例:
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
handlers=[
logging.StreamHandler(),
logging.FileHandler("app.log", encoding="utf-8")
]
)
logger = logging.getLogger(__name__)
logger.info("Service started")
多个模块间日志怎么区分?用 getLogger(__name__) 而不是全局 logging
常见错误:所有模块都直接调用 logging.info()。结果是所有日志都显示为 root,你根本分不清 database.py 还是 api.py 报的错。
正确做法:
- 每个 Python 文件顶部写
logger = logging.getLogger(__name__),__name__会自动变成模块路径(如utils.db或main) - 在
basicConfig()之后再获取 logger,否则 handler 和 level 不生效 - 不同模块可单独调整级别(比如只让
utils.db记DEBUG):logging.getLogger("utils.db").setLevel(logging.DEBUG)
线上部署前必须检查的三件事
本地跑得通 ≠ 日志可用。部署后常因权限、路径、编码崩掉:
- 文件路径是否绝对?
FileHandler("logs/app.log")在无logs/目录时会静默失败——加个os.makedirs(os.path.dirname("logs/app.log"), exist_ok=True) - Docker 或 systemd 服务中,日志文件路径是否在可写挂载卷内?别写到容器只读层
- 中文日志乱码?
FileHandler(..., encoding="utf-8")必须显式传,Windows 控制台默认 GBK,StreamHandler不支持 encoding 参数,别在这儿踩坑
真正麻烦的不是配日志,而是某天凌晨三点翻三天前的 app.log.2024-05-20 时,发现它空了——大概率是轮转配置没生效,或者磁盘满了没告警。先保底能写,再谈轮转和切割。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











