RequestLogContext和LogContext这两个上下文管理器如何使用哇

#1 · closed · 3 comments

View on GitHub ↗

fangyaopython

这两个上下文管理器如何使用了,在什么地方使用了,初学fastapi,不是很了解您这个咋用的,能给个示例吗,如何在class LoggingConfig: """统一日志配置管理""" def __init__(self) -> None: self.debug = settings.APP_DEBUG self.level = "DEBUG" if self.debug else "INFO" self.log_dir = settings.LOG_DIR self.console_only = settings.LOG_CONSOLE_ONLY self.ensure_log_dir() def ensure_log_dir(self): """确保日志目录存在""" if not os.path.exists(self.log_dir): os.makedirs(self.log_dir, exist_ok=True) def get_log_format(self): """获取统一的日志格式""" return ( "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | " "<level>{level: <8}</level> | " "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | " "<level>{message}</level>" ) def get_file_format(self): """获取文件日志格式(无颜色)""" return ( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " "{name}:{function}:{line} | " "{message}" ) def setup_logger(self,console_only=None): """配置日志输出""" # 清除默认处理器 loguru_logger.remove() # 优先使用传入参数,否则使用配置项 console_only = console_only if console_only is not None else self.console_only # 控制台输出(带颜色) loguru_logger.add( sink=sys.stdout, level=self.level, format=self.get_log_format(), colorize=True, backtrace=True, diagnose=True, ) if not console_only: # 文件输出(普通日志) loguru_logger.add( sink=f"{self.log_dir}/backend_{{time:YYYY-MM-DD}}.log", level="DEBUG", format=self.get_file_format(), rotation="100 MB", retention="5 days", compression="zip", encoding="utf-8", backtrace=True, diagnose=True, ) # 错误日志单独文件 loguru_logger.add( sink=f"{self.log_dir}/backend_error_{{time:YYYY-MM-DD}}.log", level="ERROR", format=self.get_file_format(), rotation="50 MB", retention="5 days", compression="zip", encoding="utf-8", backtrace=True, diagnose=True, ) # 为所有日志添加默认上下文 # 注意:这里重新绑定会创建新的logger实例 # 记录日志系统启动 loguru_logger.info("日志系统已启动") return loguru_logger 使用这两个上下文管理器了

Comments

JiayuXu0

这两个日志上下文管理器,用于在FastAPI应用中实现请求追踪和用户关联的日志记录: LogContext - 基础日志上下文管理器 RequestLogContext - 请求级别的日志上下文管理器 - LogContext - 基础日志上下文管理器 - 提供静态方法管理请求ID和用户ID - 使用Python的ContextVar实现异步安全的上下文传播 - 可以获取带上下文信息的logger实例 - RequestLogContext - 请求级别的上下文管理器 - 实现了 __enter__ 和 __exit__ 方法,支持 with 语句 - 自动保存和恢复上下文状态 - 支持嵌套使用 1. LogContext 类 ``` class LogContext: """日志上下文管理器""" @staticmethod def set_request_id(request_id: str | None = None) -> str: """设置请求ID""" @staticmethod def set_user_id(user_id: str | None) -> None: """设置用户ID""" @staticmethod def get_request_id() -> str: """获取当前请求ID""" @staticmethod def get_user_id() -> str: """获取当前用户ID""" @staticmethod def get_logger(): """获取带上下文的logger""" ``` 2. RequestLogContext 类(上下文管理器) ``` class RequestLogContext: """请求级别的日志上下文管理器""" def __init__(self, request_id: str | None = None, user_id: str | None = None): self.request_id = request_id self.user_id = user_id def __enter__(self): # 保存旧值并设置新值 return LogContext.get_logger() def __exit__(self, exc_type, exc_val, exc_tb): # 恢复旧值 ```

fangyaopython

> 这两个日志上下文管理器,用于在FastAPI应用中实现请求追踪和用户关联的日志记录: > > LogContext - 基础日志上下文管理器 RequestLogContext - 请求级别的日志上下文管理器 > > * LogContext - 基础日志上下文管理器 > > * 提供静态方法管理请求ID和用户ID > * 使用Python的ContextVar实现异步安全的上下文传播 > * 可以获取带上下文信息的logger实例 > * RequestLogContext - 请求级别的上下文管理器 > > * 实现了 **enter** 和 **exit** 方法,支持 with 语句 > * 自动保存和恢复上下文状态 > * 支持嵌套使用 > > 1. LogContext 类 > > ``` > class LogContext: > """日志上下文管理器""" > > @staticmethod > def set_request_id(request_id: str | None = None) -> str: > """设置请求ID""" > > @staticmethod > def set_user_id(user_id: str | None) -> None: > """设置用户ID""" > > @staticmethod > def get_request_id() -> str: > """获取当前请求ID""" > > @staticmethod > def get_user_id() -> str: > """获取当前用户ID""" > > @staticmethod > def get_logger(): > """获取带上下文的logger""" > ``` > > 2. RequestLogContext 类(上下文管理器) > > ``` > class RequestLogContext: > """请求级别的日志上下文管理器""" > > def __init__(self, request_id: str | None = None, user_id: str | None = None): > self.request_id = request_id > self.user_id = user_id > > def __enter__(self): > # 保存旧值并设置新值 > return LogContext.get_logger() > > def __exit__(self, exc_type, exc_val, exc_tb): > # 恢复旧值 > ```

fangyaopython

<img width="604" height="692" alt="Image" src="https://github.com/user-attachments/assets/4f15d486-0372-43f8-8a1d-ae6b4b03e337" />,,例如这样使用是吧