You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何根据开发/发布状态设置Python日志级别?能否写入setup.py?

当然可以把日志级别配置在setup.py里,但说实话,这并不是最灵活的解决方案——而且其实还没从根本上解决你担心的「发布时忘记修改」的问题。先给你说说直接在setup.py里配置的方法,再聊聊更靠谱的自动切换方案。

直接在setup.py中配置日志级别的方法

你可以在setup.py里定义一个日志级别的变量,然后通过setup()options参数把它嵌入到包的元数据中,之后在工具代码里读取这个值。举个例子:

setup.py中:

from setuptools import setup

# 开发阶段设为DEBUG,发布前需要手动改成INFO/WARNING
DEFAULT_LOG_LEVEL = "DEBUG"

setup(
    name="your-awesome-tool",
    version="0.1.0",
    # 其他必填配置(packages、entry_points等)...
    options={
        "your_awesome_tool": {
            "log_level": DEFAULT_LOG_LEVEL
        }
    }
)

然后在你的工具核心代码中读取这个配置:

import logging
from pkg_resources import get_distribution

def init_logging():
    # 获取包的元数据
    dist = get_distribution("your-awesome-tool")
    # 读取setup.py中配置的日志级别,默认设为INFO
    log_level_str = dist.get_option_dict("your_awesome_tool").get("log_level", ("default", "INFO"))[1]
    # 转换为logging模块对应的级别常量
    log_level = getattr(logging, log_level_str.upper())
    logging.basicConfig(level=log_level)

# 初始化日志
init_logging()

不过这个方法的缺点很明显:一旦用普通pip install(非可编辑模式)安装,这个日志级别就会被固化在安装的元数据里,没法动态修改;而且你还是得手动在发布前修改setup.py里的变量,本质上没解决「忘记改」的痛点。

更推荐的自动切换方案

其实更好的思路是让工具自动判断当前是开发模式还是生产模式,然后自动设置对应的日志级别,完全不用手动修改配置。这里有个可靠的实现方式:

步骤1:判断是否为可编辑安装

可编辑安装(pip install -e .)时,包的安装路径会指向你的本地源码目录,而非系统的site-packages。我们可以通过这一点来判断环境:

import os
from importlib.metadata import distribution

def is_development_mode():
    # 获取当前包的安装路径
    dist = distribution("your-awesome-tool")
    install_root = dist.locate_file("")
    # 获取本地源码的根目录(假设你的主模块在src/your_awesome_tool下,根据实际调整路径)
    src_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
    # 判断两个路径是否一致
    return os.path.samefile(install_root, src_root)

步骤2:自动设置日志级别

结合上面的判断,在初始化日志时自动切换级别,同时支持环境变量强制覆盖:

import logging

def init_logging():
    # 优先读取环境变量(方便用户强制覆盖日志级别)
    env_log_level = os.getenv("YOUR_TOOL_LOG_LEVEL")
    if env_log_level:
        try:
            log_level = getattr(logging, env_log_level.upper())
        except AttributeError:
            # 如果环境变量设置的级别无效, fallback到自动判断的级别
            log_level = logging.INFO if not is_development_mode() else logging.DEBUG
    else:
        # 自动判断环境设置级别
        log_level = logging.DEBUG if is_development_mode() else logging.INFO
    
    logging.basicConfig(
        level=log_level,
        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    )

init_logging()

这样一来:

  • 当你用pip install -e .调试时,自动启用DEBUG级别日志;
  • 发布后用普通pip install安装时,自动切换为INFO级别;
  • 如果用户需要临时开启调试日志,只需要设置环境变量export YOUR_TOOL_LOG_LEVEL=DEBUG即可,非常灵活。
总结

把日志级别放在setup.py里是可行的,但不够灵活,也没解决「忘记修改」的核心问题。推荐使用自动判断安装模式+环境变量覆盖的方案,既省心又能应对各种场景。

内容的提问来源于stack exchange,提问作者sanders

火山引擎 最新活动