""" 使用 structlog 的结构化日志配置。 """ import logging import sys from typing import Any import structlog from structlog.types import EventDict, Processor def add_app_context(logger: Any, method_name: str, event_dict: EventDict) -> EventDict: """ 向日志事件添加应用程序上下文。 Args: logger: 日志记录器实例 method_name: 方法名 event_dict: 事件字典 Returns: EventDict: 修改后的事件字典 """ event_dict["app"] = "langchain-learning-kit" return event_dict def configure_logging(log_level: str = "INFO") -> None: """ 配置结构化日志。 Args: log_level: 日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL) """ # 配置标准日志 logging.basicConfig( format="%(message)s", stream=sys.stdout, level=getattr(logging, log_level.upper()), ) # 配置 structlog structlog.configure( processors=[ structlog.contextvars.merge_contextvars, structlog.processors.add_log_level, structlog.processors.StackInfoRenderer(), structlog.dev.set_exc_info, structlog.processors.TimeStamper(fmt="iso"), add_app_context, structlog.processors.JSONRenderer(), ], wrapper_class=structlog.make_filtering_bound_logger( getattr(logging, log_level.upper()) ), context_class=dict, logger_factory=structlog.PrintLoggerFactory(), cache_logger_on_first_use=True, ) def get_logger(name: str = __name__) -> structlog.BoundLogger: """ 获取结构化日志记录器实例。 Args: name: 日志记录器名称 Returns: structlog.BoundLogger: 日志记录器实例 """ return structlog.get_logger(name)