73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
"""
|
||
使用 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)
|