Python 内置的 logging 库使用数字等级来控制日志输出。当给日志器设置等级时,相当于设置一个条件,低于这个等级的日志会被直接丢弃,等于或高于才会输出。日志输出规则用一句话来说就是:消息等级 ≥ 当前设置的门槛 → 才会输出import logging# 设置门槛:INFO 及以上才输出logging.basicConfig(level=logging.INFO)logger = logging.getLogger(__name__)# 不输出(DEBUG < INFO)logger.debug("解析请求体...")# 输出logger.info("数据库连接成功")# 输出logger.error("调用下游服务失败")
有个最容易踩的坑,等级继承机制。根日志器默认等级是 WARNING (30)。
如果你只创建子日志器,不设置等级,它会继承根日志器。经典陷阱:
import logging# 子日志器,继承根的 WARNING 级别logger = logging.getLogger("app.database")# 你以为会输出,其实不会!logger.info("连接中...")
解决方式是,必须给日志器设置等级,或配置 root。在生产环境里,要从环境变量动态配置。不要在代码里硬编码日志等级
import osimport logging# 从环境变量获取,默认 INFOlog_level = os.getenv("LOG_LEVEL", "INFO").upper()level = getattr(logging, log_level, logging.INFO)# 配置格式与等级logging.basicConfig( level=level, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")logger = logging.getLogger("app")logger.info(f"日志等级已设置为: {log_level}")
在不同环境下推荐的日志等级也是不同的,在开发环境下推荐使用LOG_LEVEL=DEBUG看请求、SQL、变量、流程,方便快速定位 bug。
生产环境下设置LOG_LEVEL=INFO 或 WARNING,避免 DEBUG 产生海量日志;防止占满磁盘;避免压垮日志收集系统(ELK/Loki/Splunk);提升 I/O 性能最后总结一下,数字越大表示级别越高;只输出大于等于当前级别的日志;子日志器会继承父级等级,生产环境不要用硬编码,要用环境变量控制,开发用DEBUG,生产用INFO