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)
|