结论:需调用 logging.basicConfig(level=logging.DEBUG) 才能显示 DEBUG 日志,因默认级别为 WARNING;配置须在首次日志调用前完成且仅首次生效,推荐用环境变量动态控制 level 并结合 format 与多 handler 实现分级输出。

直接说结论:用 logging.basicConfig() 配置一次,再用 logging.debug()、logging.info() 等函数打日志,就能实现分级输出;但默认不显示 DEBUG 和 WARNING 以下级别,必须显式设 level 参数。
为什么脚本跑起来没看到 DEBUG 日志?
因为 logging 默认日志级别是 WARNING,DEBUG 和 INFO 被静默丢弃了。不是代码没执行,是被过滤掉了。
- 调用
logging.basicConfig(level=logging.DEBUG)才能看见DEBUG级别输出 - 如果只写
basicConfig()不带level,等价于level=logging.WARNING - 配置必须在首次调用
logging.debug()或类似函数前完成,否则无效 - 多次调用
basicConfig()只有第一次生效(这是个常见坑)
如何让不同环境输出不同级别日志?
靠运行时传参或读取环境变量控制 level,而不是硬编码。比如:
import logging
import os
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
logging.basicConfig(
level=getattr(logging, log_level, logging.INFO),
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
-
getattr(logging, "DEBUG")比直接写logging.DEBUG更安全,避免拼错导致异常 -
format中%(levelname)s能直观区分日志等级,调试时特别有用 - 本地开发设
LOG_LEVEL=DEBUG,生产环境设LOG_LEVEL=WARNING,无需改代码
自动化脚本里怎么避免日志污染终端?
脚本常被 cron 或其他程序调用,混着 print() 和未格式化的 logging 输出会导致解析困难。
立即学习“Python免费学习笔记(深入)”;
- 统一用
logging,禁用所有print()(尤其上线后) - 加
force=True参数可绕过basicConfig()只生效一次的限制(Python 3.8+) - 写文件时用
handlers显式指定,比如:logging.FileHandler("run.log", encoding="utf-8"),避免 Windows 下中文乱码 - 若需同时输出到终端和文件,得用
logging.getLogger().addHandler()手动添加多个 handler,basicConfig()不支持多目标
分级日志真正的复杂点不在写法,而在于「什么时候该用哪个级别」:比如连接失败用 ERROR,重试成功用 INFO,而每轮循环的中间状态通常该用 DEBUG——但它不该出现在生产日志里。这个分寸得结合脚本用途反复调整,不是配对 level 就完事。


















