diff --git a/apps/jingrow/jingrow/__init__.py b/apps/jingrow/jingrow/__init__.py index 6fae9af..674f6bb 100644 --- a/apps/jingrow/jingrow/__init__.py +++ b/apps/jingrow/jingrow/__init__.py @@ -5,12 +5,36 @@ from typing import Dict, List, Any, Optional, Union import functools import inspect import logging +import os from jingrow.model.page import Page from jingrow.config import Config _adapter = None _local = {} +# 统一 Jingrow 日志记录器(仅为本模块及调用方提供最小可用输出,不修改全局 root logger) +_root_logger = logging.getLogger("jingrow") + +def _ensure_logging_configured() -> None: + + if not _root_logger.handlers: + handler = logging.StreamHandler() + formatter = logging.Formatter( + fmt="%(asctime)s %(levelname)s %(name)s - %(message)s" + ) + handler.setFormatter(formatter) + _root_logger.addHandler(handler) + # 从配置文件(Config)读取日志级别(默认 INFO) + 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) + def _init_adapter(run_mode: str = "api"): global _adapter @@ -50,8 +74,21 @@ def db_get_value(pagetype: str, filters: Dict[str, Any] = None, fieldname: str = def db_set_value(pagetype: str, filters: Dict[str, Any] = None, fieldname: str = None, value: Any = None): return _adapter.db_set_value(pagetype, filters, fieldname, value) -def log_error(title: str, message: str): - return _adapter.log_error(title, message) +def log_error(title: Optional[str] = None, message: Optional[str] = None, *, exc: Optional[BaseException] = None) -> None: + """输出错误日志到终端。 + + 调用约定: + - log_error(content) -> 仅内容 + - log_error(title, content) -> 标题 + 内容 + - 可选 exc=Exception(...) 传入异常以带上堆栈 + """ + _ensure_logging_configured() + # 兼容仅传内容或传标题+内容两种形式 + if message is None: + content = "" if title is None else str(title) + else: + content = str(message) if title is None else f"{title} - {message}" + _root_logger.error(content, exc_info=exc) def throw(title: str, message: str): return _adapter.throw(title, message) diff --git a/apps/jingrow/jingrow/config.py b/apps/jingrow/jingrow/config.py index e0563ea..5e1be46 100644 --- a/apps/jingrow/jingrow/config.py +++ b/apps/jingrow/jingrow/config.py @@ -35,6 +35,8 @@ class Settings(BaseSettings): run_mode: str = 'api' # 环境:development/production(控制启动模式、热重载等) environment: str = 'development' + # 日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL(全局默认级别) + log_level: str = 'INFO' # 本地后端主机配置 backend_host: str = '0.0.0.0'