FastAPI是一款快速而强大的Python框架,因其高性能和易用性而受到了广泛的欢迎。在实现RESTful API时,日志记录是不可或缺的一部分。本文将介绍如何使用FastAPI来实现结构化JSON日志记录,以方便在大型项目中进行更好的调试和排错。

使用结构化日志记录是一种将日志转换为机器可读格式的方法。相比起传统的文本日志,结构化日志更加可读和易于处理。结构化日志的一个显著的优点是它能够提供更详细的信息,包括应用程序的状态、异常情况和通信请求的详细记录。

在FastAPI中,使用Python标准库logging来进行日志记录。FastAPI提供了一个可用于配置日志记录的默认配置项。但是,这些设置无法直接生成结构化日志。因此,我们需要将其与Python库structlog结合使用,以便能够在FastAPI项目中生成结构化日志。

下面是使用structlog和FastAPI生成结构化日志的基本步骤:

1. 安装必要的库

运行以下命令来安装所需的库:

“`

pip install fastapi structlog loguru

“`

2. 配置日志记录

在FastAPI中,我们可以创建一个日志记录器实例,并使用`uvicorn`库来启动应用程序。在启动应用程序之前,我们需要配置日志记录器,以确保输出是结构化的。

以下是用于配置日志记录的代码示例:

“`

import logging.config

import loguru

import structlog

LOGGING_CONFIG = {

‘version’: 1,

‘disable_existing_loggers’: False,

‘formatters’: {

‘json’: {

‘()’: structlog.stdlib.ProcessorFormatter,

‘processor’: structlog.processors.JSONRenderer(),

},

},

‘handlers’: {

‘console’: {

‘class’: ‘logging.StreamHandler’,

‘formatter’: ‘json’,

},

},

‘loggers’: {

”: {

‘handlers’: [‘console’],

‘level’: ‘INFO’,

‘propagate’: True,

},

},

}

def configure_logging():

“””Configure logging.”””

# 安装loguru兼容structlog的回溯组件

structlog.configure_once(

processors=[

structlog.processors.TimeStamper(fmt=’iso’),

structlog.processors.StackInfoRenderer(),

structlog.processors.format_exc_info,

structlog.processors.JSONRenderer(),

],

context_class=dict,

logger_factory=structlog.stdlib.LoggerFactory(),

wrapper_class=structlog.stdlib.BoundLogger,

cache_logger_on_first_use=True,

)

# 配置logging

logging.config.dictConfig(LOGGING_CONFIG)

# 安装loguru的捕获器和处理器

loguru.logger.enable(

sink=log_capture,

backtrace=True,

colorize=True,

diagnose=True,

)

“`

3. 注册中间件

在FastAPI中,中间件为应用程序和请求处理程序之间的组件。可以使用中间件来记录请求处理的时间和其他统计信息。

以下是用于注册中间件的代码示例:

“`

@app.middleware(“http”)

async def add_logger(request: Request, call_next):

“””Adds a logger to the request context.”””

logger = structlog.get_logger()

request.state.logger = logger.bind(request_id=str(uuid.uuid4()))

response = await call_next(request)

return response

“`

4. 使用日志记录器

使用结构化日志记录器是一种直接记录JSON格式日志记录的好方法。我们可以使用structlog库来生成JSON格式的日志记录。

以下是使用结构化日志记录器的代码示例:

“`

@app.post(“/items/”, response_model=Item)

async def create_item(item: Item, logger: Logger = Depends(get_logger)):

“””

Create an item with all the information:

– **name**: each item must have a name

– **description**: a long description

– **price**: price

– **tax**: tax

“””

response = None

logger = logger.bind(action=’create_item’, item=item.dict())

try:

item = create_new_item(item)

response = item

logger.info(‘item created’, item=item.dict())

except ValueError as e:

logger.error(str(e))

return response

“`

通过使用structlog和FastAPI,我们可以轻松地实现结构化JSON日志记录。这不仅有助于改善调试和排错过程,而且可以提高应用程序的可读性和可维护性。如果你正在开发一个需要快速响应的RESTful API,那么FastAPI是一个非常值得推荐的选择,并且结构化日志记录能够帮你更好地使用FastAPI。

详情参考

了解更多有趣的事情:https://blog.ds3783.com/