Python日志级别设置与输出控制
在 Python 的 logging 模块中,日志级别设置决定了不同严重程度的日志消息是否会被实际输出。以下是关键概念和关系的详细说明:
- 日志级别关系(从低到高)
级别常量 | 数值 | 方法 | 说明
DEBUG | 10 | log.debug() | 调试细节(开发阶段使用)
INFO | 20 | log.info() | 程序正常运行信息
WARNING | 30 | log.warning() | 潜在问题警告(默认级别)
ERROR | 40 | log.error() | 严重错误(功能部分失效)
CRITICAL | 50 | log.critical() | 致命错误(程序可能崩溃)
- 日志能否打印的核心规则
一条日志消息能否输出取决于:
Logger 的级别设置
Handler 的级别设置
消息必须同时满足:
python
日志消息级别 >= Logger设置级别
且
日志消息级别 >= Handler设置级别
- 配置层级与影响
(1) Logger 级别(核心过滤器)
import logging
logger = logging.getLogger("my_logger")
logger.setLevel(logging.INFO) # 关键设置!
作用:全局过滤低级别消息。
示例:
若设为 INFO:DEBUG 消息会被 丢弃,INFO 及以上会传递到 Handler。
(2) Handler 级别(最终输出控制)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING) # 控制台只输出 WARNING 以上
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.DEBUG) # 文件记录所有 DEBUG 以上
作用:精细化控制不同输出目标的级别。
典型场景:
控制台只显示 WARNING+
文件记录 DEBUG+ 完整日志
- 默认行为
未显式设置时:
Logger 默认级别:WARNING (30)
内置的 StreamHandler 默认级别:NOTSET (0),即不额外过滤
- 实际输出判断流程
- 示例场景
import logging
# 配置 Logger
logger = logging.getLogger("example")
logger.setLevel(logging.INFO) # 全局过滤 DEBUG
# 配置 Handler(控制台输出)
console = logging.StreamHandler()
console.setLevel(logging.WARNING) # 控制台只显示 WARNING+
logger.addHandler(console)
# 测试日志
logger.debug("Debug 消息") # 被 Logger 过滤(INFO < DEBUG? 不成立)
logger.info("Info 消息") # 通过 Logger,但被 Handler 过滤(INFO < WARNING)
logger.warning("警告消息") # 输出到控制台
logger.error("错误消息") # 输出到控制台
- 关键结论
双重过滤:Logger 级别做粗粒度过滤,Handler 级别做细粒度控制。
级别继承:未显式设置时,Logger 会继承父 Logger 的级别。
NOTSET 特殊值:若设置为 NOTSET,Logger/Handler 会向上级继承级别(根 Logger 默认为 WARNING)。
最佳实践:
开发环境:Logger 设为 DEBUG + Handler 按需设置
生产环境:Logger 设为 INFO/WARNING + 文件 Handler 存 DEBUG 完整日志
📌 总结:
日志方法(debug()/info()/error())仅生成对应级别的消息
实际输出由 Logger 和 Handler 的级别设置共同决定
需同时配置两者才能精确控制日志输出