Connexion Flask 日志记录格式

问题描述

我正在努力使用 gevent 服务器设置连接烧瓶休息 api 的日志记录。我只想在每次请求后记录消息,例如 GET /health HTTP/1.1 甚至更好的 http 状态代码,例如200。在创建应用程序之前,我按照烧瓶文档设置了一个 dictConfig。像这样:

import connexion
from logging.config import dictConfig


def main():
    app = connexion.App(__name__)
    app.app.logger.info('This is a check!')
    app.add_api('swagger.yaml')
    app.run(server='gevent')

if __name__ == '__main__':

    dictConfig({
        'version': 1,'formatters': {'default': {
            'format': 'Custom message: %(message)s',}},'handlers': {'wsgi': {
            'class': 'logging.StreamHandler','stream': 'ext://flask.logging.wsgi_errors_stream','formatter': 'default'
        }},'root': {
            'level': 'INFO','handlers': ['wsgi']
        }
    })

    main()

启动应用并发送两个请求(一个 200 和一个 405)后:

Custom message: This is a check!
127.0.0.1 - - [2021-03-15 12:42:35] "GET /health HTTP/1.1" 200 126 0.001714
127.0.0.1 - - [2021-03-15 12:42:35] "PUT /health HTTP/1.1" 405 275 0.000711

因此,在 app.run() 之前,app.app.logging() 看起来不错并且只发送消息 Custom message: This is a check!,但之后日志不再遵循字典。 知道我做错了什么吗?

解决方法

据我所知 dictConfig 没有被使用,因为你没有将它分配给任何东西。

你需要类似的东西

logging.config.dictConfig(yourconfig)

其中 yourconfig 是您的 dictConfig。将您的 dictConfig 移至 main() 以使其处于同一范围内,或者如果您选择将其分开,则从文件中导入它。

见:Logging Cookbook

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...