如何获得不同结构和不同字段的JSON格式的FastAPI应用程序的控制台日志?
问题描述
我有一个fast API应用程序,我想在其中使用以下数据以JSON格式将默认日志写入STDOUT:
应用程序日志应如下所示:
访问日志应如下所示:
我尝试的内容
我尝试使用json-logging
包来实现这一点。使用this示例,我能够访问json中的请求日志并更改结构。但我找不到如何访问和更改应用程序日志。
当前输出日志结构
推荐答案
您可以通过使用内置记录器模块创建自定义Formatter来完成此操作。您可以在记录消息时使用extra
参数来传递上下文信息,如URL和标头。Python's JSON module已经在dump()
函数中实现了漂亮的打印JSON数据,使用indent
参数定义缩进级别。下面是一个使用自定义格式化程序以您在问题中描述的格式记录消息的工作示例。例如,对于App日志,使用logger.info('sample log message')
,而对于访问日志,使用logger.info('sample log message', extra={'extra_info': get_extra_info(request)})
。通过将request
实例传递给get_extra_info()
方法,您可以提取上面提到的信息。有关更多LogRecord属性,请查看here。下面的示例也使用FileHandler
将消息记录在日志文件中。如果您不需要它,可以在get_logger()
方法中将其注释掉。
app_logger.py
app_logger_formatter.py
app.py
更新%1
记录请求/响应的更好方法是添加FastAPI Middleware,它接受到达应用程序的每个请求,以及返回之前的每个响应。示例如下(app_logger.py和app_logger_Formatter.py保持不变)。
app.py
更新%2
除了前面的更新之外,您还可以使用background task
来记录数据,而不是让响应等待记录发生后再返回。后台任务将仅在";发送后运行(根据Starlette documentation)。您可以定义一个任务函数在后台运行,用于写入日志数据,如下图所示:
然后,在中间件内部,您可以将(上面)任务函数传递给background tasks
,如下所示(信用给this post):
输出:
这篇关于如何获得不同结构和不同字段的JSON格式的FastAPI应用程序的控制台日志?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!