RequestLogContext和LogContext这两个上下文管理器如何使用哇
#1 · closed · 3 comments
View on GitHub ↗
这两个上下文管理器如何使用了,在什么地方使用了,初学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
这两个日志上下文管理器,用于在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):
# 恢复旧值
```
> 这两个日志上下文管理器,用于在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):
> # 恢复旧值
> ```
<img width="604" height="692" alt="Image" src="https://github.com/user-attachments/assets/4f15d486-0372-43f8-8a1d-ae6b4b03e337" />,,例如这样使用是吧