From 30d3c1bbcea13c8b9d5931952157ae7eb326f8e5 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:24:38 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Feature:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=A0=88=E8=AF=86=E5=88=AB=20(#2644)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot/log.py | 6 ++++-- nonebot/plugin/on.py | 11 +++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/nonebot/log.py b/nonebot/log.py index 19739227..a0f6bceb 100644 --- a/nonebot/log.py +++ b/nonebot/log.py @@ -13,6 +13,7 @@ FrontMatter: """ import sys +import inspect import logging from typing import TYPE_CHECKING @@ -45,6 +46,7 @@ logger: "Logger" = loguru.logger # logger.addHandler(default_handler) +# https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging class LoguruHandler(logging.Handler): # pragma: no cover """logging 与 loguru 之间的桥梁,将 logging 的日志转发到 loguru。""" @@ -54,8 +56,8 @@ class LoguruHandler(logging.Handler): # pragma: no cover except ValueError: level = record.levelno - frame, depth = sys._getframe(6), 6 - while frame and frame.f_code.co_filename == logging.__file__: + frame, depth = inspect.currentframe(), 0 + while frame and (depth == 0 or frame.f_code.co_filename == logging.__file__): frame = frame.f_back depth += 1 diff --git a/nonebot/plugin/on.py b/nonebot/plugin/on.py index b575282b..7c0934c5 100644 --- a/nonebot/plugin/on.py +++ b/nonebot/plugin/on.py @@ -76,7 +76,7 @@ def get_matcher_module(depth: int = 1) -> Optional[ModuleType]: # pragma: no co return (source := get_matcher_source(depth + 1)) and source.module -def get_matcher_source(depth: int = 1) -> Optional[MatcherSource]: +def get_matcher_source(depth: int = 0) -> Optional[MatcherSource]: """获取事件响应器定义所在源码信息。 参数: @@ -85,7 +85,14 @@ def get_matcher_source(depth: int = 1) -> Optional[MatcherSource]: current_frame = inspect.currentframe() if current_frame is None: return None - frame = inspect.getouterframes(current_frame)[depth + 1].frame + + frame = current_frame + d = depth + 1 + while d > 0: + frame = frame.f_back + if frame is None: + raise ValueError("Depth out of range") + d -= 1 module_name = (module := inspect.getmodule(frame)) and module.__name__