当前位置:首页>python>Python Logging 各level等级使用实践

Python Logging 各level等级使用实践

  • 2026-10-11 08:00:14
Python Logging 各level等级使用实践
Python 内置的 logging 库使用数字等级来控制日志输出。当给日志器设置等级时,相当于设置一个条件,低于这个等级的日志会被直接丢弃,等于或高于才会输出。
接下来我们先看一下它的几个等级及用途
等级
数值
用途
例子
CRITICAL
50
致命错误,程序无法继续运行
内存不足、数据库断开、磁盘满
ERROR
40
功能执行失败,但程序还能跑
API 超时、文件写入失败、数据解析错误
WARNING
30
默认等级,意外但非错误
磁盘空间不足、使用废弃 API、登录失败
INFO
20
正常运行的关键流程
服务启动、数据库连接成功、任务完成
DEBUG
10
调试细节,开发 / 排查用
SQL 语句、请求体、变量值、流程分支
NOTSET
0
不设置,继承父级
子日志器默认值
日志输出规则用一句话来说就是:消息等级 ≥ 当前设置的门槛 → 才会输出
我们来看个最简单的示例
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

最新文章

随机文章