Python

Python日志级别设置与输出控制

在 Python 的 logging 模块中,日志级别设置决定了不同严重程度的日志消息是否会被实际输出。以下是关键概念和关系的详细说明:

  1. 日志级别关系(从低到高)

级别常量 | 数值 | 方法 | 说明

DEBUG | 10 | log.debug() | 调试细节(开发阶段使用)
INFO | 20 | log.info() | 程序正常运行信息
WARNING | 30 | log.warning() | 潜在问题警告(默认级别)
ERROR | 40 | log.error() | 严重错误(功能部分失效)
CRITICAL | 50 | log.critical() | 致命错误(程序可能崩溃)

  1. 日志能否打印的核心规则

一条日志消息能否输出取决于:

Logger 的级别设置

Handler 的级别设置

消息必须同时满足:

python
日志消息级别 >= Logger设置级别

日志消息级别 >= Handler设置级别

  1. 配置层级与影响

(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+ 完整日志

  1. 默认行为

未显式设置时:

Logger 默认级别:WARNING (30)

内置的 StreamHandler 默认级别:NOTSET (0),即不额外过滤

  1. 实际输出判断流程

2025-07-22T12:28:29.png

  1. 示例场景
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("错误消息")     # 输出到控制台
  1. 关键结论

双重过滤:Logger 级别做粗粒度过滤,Handler 级别做细粒度控制。

级别继承:未显式设置时,Logger 会继承父 Logger 的级别。

NOTSET 特殊值:若设置为 NOTSET,Logger/Handler 会向上级继承级别(根 Logger 默认为 WARNING)。

最佳实践:

开发环境:Logger 设为 DEBUG + Handler 按需设置

生产环境:Logger 设为 INFO/WARNING + 文件 Handler 存 DEBUG 完整日志

📌 总结:

日志方法(debug()/info()/error())仅生成对应级别的消息

实际输出由 Logger 和 Handler 的级别设置共同决定

需同时配置两者才能精确控制日志输出

回复

This is just a placeholder img.