langchain-learning-kit/app/utils/logger.py

73 lines
1.8 KiB
Python
Raw Permalink Normal View History

"""
使用 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: 日志级别DEBUGINFOWARNINGERRORCRITICAL
"""
# 配置标准日志
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)