Skip to content

Bug: 无法使用 dotenv 或环境变量方式为 log_level 设置数字值 #3724

@BiologyHazard

Description

@BiologyHazard

操作系统

Windows

Python 版本

3.13.2

NoneBot 版本

2.4.3

适配器

协议端

描述问题

相关文档

文档 - 深入 - 配置 - 内置配置项 - Log Level 中说 log_level 的类型为 int | str,表示 Loguru 的日志等级。

问题

但是,如果我在 .env 中写 LOG_LEVEL=10,或者使用环境变量 export LOG_LEVEL=10,解析配置的时候会把这个 10 解析为字符串的 "10",从而引发日志错误。

--- Logging error in Loguru Handler #1 ---
...
ValueError: Level '10' does not exist
--- End of logging error ---

进一步的说明

打印 nonebot.get_driver().config 也可以看到这一点:

>>> print(repr(nonebot.get_driver().config))
Config(..., log_level='10', ...)

log_level 被错误地解析为了字符串的 "10",而我想要的是数字 10

可能的解决办法

我能想到的解决办法是,使用 pydanticfield_validator,为 log_level 添加一个类似这样的 field_validator

class Config(BaseSettings):
    log_level: Union[int, str] = "INFO"

    ...

    @field_validator("log_level", mode="after")
    @classmethod
    def validate_log_level(cls, v: Union[int, str]) -> Union[int, str]:
        if isinstance(v, str) and v.isdigit():
            return int(v)
        elif isinstance(v, str):
            return v.upper()
        else:
            return v

或者……修改文档?

复现步骤

  1. 安装 python 以及 nonebot2[fastapi]

  2. 新建文件 .env,内容为

LOG_LEVEL=10
  1. 新建文件 bot.py,内容为
import nonebot

nonebot.init()

print(repr(nonebot.get_driver().config))
  1. 运行 python bot.py

  2. 得到日志错误,并且 config 中的 log_level 是字符串 '10'

期望的结果

期望当 log_level 为数字时,能正确解析为数字

截图或日志

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions