diff --git a/apps/jingrow/jingrow/__init__.py b/apps/jingrow/jingrow/__init__.py index d32f2ab..8bd2b97 100644 --- a/apps/jingrow/jingrow/__init__.py +++ b/apps/jingrow/jingrow/__init__.py @@ -26,44 +26,6 @@ for _lvl in list(_ANSI.keys()): _code = _ANSI[_lvl] logging.addLevelName(getattr(logging, _lvl), f"{_code}{_lvl}\x1b[0m") -def _ensure_logging_configured() -> None: - - # 统一在 root logger 上配置输出与格式,这样通过名为 "jingrow" 的 logger 打印时, - # 也会以 "jingrow - ERROR - ... - 时间" 的格式输出,并带颜色的级别名。 - root_logger = logging.getLogger() - if not root_logger.handlers: - handler = logging.StreamHandler() - # 统一样式:不含 logger 名称,只输出级别、消息、时间 - formatter = logging.Formatter("%(levelname)s - %(message)s - %(asctime)s") - handler.setFormatter(formatter) - root_logger.addHandler(handler) - try: - level_name = str(getattr(Config, 'log_level', 'INFO')).upper() - except Exception: - level_name = 'INFO' - try: - level = getattr(logging, level_name, logging.INFO) - except Exception: - level = logging.INFO - root_logger.setLevel(level) - - # 如果已存在其他 handler,但需要强制向控制台输出(例如运行在 API 模式), - # 则在设置了环境变量 JINGROW_STREAM_LOGGING 的情况下,补充一个 StreamHandler。 - try: - force_stream = os.environ.get("JINGROW_STREAM_LOGGING") - except Exception: - force_stream = None - if force_stream and not any(isinstance(h, logging.StreamHandler) for h in root_logger.handlers): - _sh = logging.StreamHandler() - _sh.setFormatter(logging.Formatter("%(levelname)s - %(message)s - %(asctime)s")) - root_logger.addHandler(_sh) - - # 使用 root 的处理器,避免 jingrow 自带 handler 导致重复输出 - if _root_logger.handlers: - _root_logger.handlers.clear() - _root_logger.propagate = True - # 与 root 保持同级别,避免级别不一致导致丢日志 - _root_logger.setLevel(root_logger.level) # ====== High-level helpers to enforce Page lifecycle (hooks) ====== @@ -144,6 +106,44 @@ def get_meta(pagetype: str): """获取 pagetype 的元数据,返回后端适配器的原始结果结构。""" return Page(pagetype).get_meta() +def _ensure_logging_configured() -> None: + + # 统一在 root logger 上配置输出与格式,这样通过名为 "jingrow" 的 logger 打印时, + # 也会以 "jingrow - ERROR - ... - 时间" 的格式输出,并带颜色的级别名。 + root_logger = logging.getLogger() + if not root_logger.handlers: + handler = logging.StreamHandler() + # 统一样式:不含 logger 名称,只输出级别、消息、时间 + formatter = logging.Formatter("%(levelname)s - %(message)s - %(asctime)s") + handler.setFormatter(formatter) + root_logger.addHandler(handler) + try: + level_name = str(getattr(Config, 'log_level', 'INFO')).upper() + except Exception: + level_name = 'INFO' + try: + level = getattr(logging, level_name, logging.INFO) + except Exception: + level = logging.INFO + root_logger.setLevel(level) + + # 如果已存在其他 handler,但需要强制向控制台输出(例如运行在 API 模式), + # 则在设置了环境变量 JINGROW_STREAM_LOGGING 的情况下,补充一个 StreamHandler。 + try: + force_stream = os.environ.get("JINGROW_STREAM_LOGGING") + except Exception: + force_stream = None + if force_stream and not any(isinstance(h, logging.StreamHandler) for h in root_logger.handlers): + _sh = logging.StreamHandler() + _sh.setFormatter(logging.Formatter("%(levelname)s - %(message)s - %(asctime)s")) + root_logger.addHandler(_sh) + + # 使用 root 的处理器,避免 jingrow 自带 handler 导致重复输出 + if _root_logger.handlers: + _root_logger.handlers.clear() + _root_logger.propagate = True + # 与 root 保持同级别,避免级别不一致导致丢日志 + _root_logger.setLevel(root_logger.level) def log_error(title: Optional[str] = None, message: Optional[str] = None, *, exc: Optional[BaseException] = None) -> None: """输出错误日志到终端。