Flask 学习-54.Flask-RESTX 结合 namespace 使用 logging日志

前言

Flask-RESTX 通过提供每个和它自己的标准 Python实例来扩展Flask 的日志记录。这允许在每个命名空间的基础上分离日志记录,以允许更细粒度的细节和配置。

基本示例

默认情况下,这些记录器从 Flask 应用程序对象记录器继承配置。

import logging

import flask

from flask_restx import Api, Resource

# configure root logger
logging.basicConfig(level=logging.INFO)

app = flask.Flask(__name__)

api = Api(app)


# each of these loggers uses configuration from app.logger
ns1 = api.namespace('api/v1', description='test')
ns2 = api.namespace('api/v2', description='test')


@ns1.route('/my-resource')
class MyResource(Resource):
    def get(self):
        # will log
        ns1.logger.info("hello from ns1")
        return {"message": "hello"}


@ns2.route('/my-resource')
class MyNewResource(Resource):
    def get(self):
        # won't log due to INFO log level from app.logger
        ns2.logger.debug("hello from ns2")
        return {"message": "hello"}

记录器可以单独配置以覆盖来自 Flask 应用程序对象记录器的配置。在上面的例子中,ns2日志级别可以单独设置 DEBUG:

# ns1 will have log level INFO from app.logger
ns1 = api.namespace('api/v1', description='test')

# ns2 will have log level DEBUG
ns2 = api.namespace('api/v2', description='test')
ns2.logger.setLevel(logging.DEBUG)


@ns1.route('/my-resource')
class MyResource(Resource):
    def get(self):
        # will log
        ns1.logger.info("hello from ns1")
        return {"message": "hello"}


@ns2.route('/my-resource')
class MyNewResource(Resource):
    def get(self):
        # will log
        ns2.logger.debug("hello from ns2")
        return {"message": "hello"}

全局配置logging

如果觉得上面的分离记录日志麻烦,可以在整个项目中使用一个全局配置。
apis/__init__.py中配置全局dictConfig

from flask import Flask
from logging.config import dictConfig


dictConfig({
        "version": 1,
        "disable_existing_loggers": False,
        "formatters": {  # 日志输出样式
            "default": {
                "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
            }
        },
        "handlers": {
            "console": {
                "class": "logging.StreamHandler",  # 控制台输出
                "level": "DEBUG",
                "formatter": "default",
            },
            "log_file": {
                "class": "logging.handlers.RotatingFileHandler",
                "level": "INFO",
                "formatter": "default",   # 日志输出样式对应formatters
                "filename": "flask.log",  # 指定log文件目录
                "maxBytes": 20*1024*1024,   # 文件最大20M
                "backupCount": 10,          # 最多10个文件
                "encoding": "utf8",         # 文件编码
            },

        },
        "root": {
            "level": "INFO",  # # handler中的level会覆盖掉这里的level
            "handlers": ["console", "log_file"],
        },
    }
)


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    # ......
    
    from .auth import api as ns1
    from .blog import api as ns2
    api.add_namespace(ns1)
    api.add_namespace(ns2)
    # ...
    api.init_app(app)

    return app

在视图namespace视图中使用日志

from flask_restx import Api, Resource, fields, Namespace
api = Namespace('todos', description='TODO operations')


@api.route('/')
class TodoList(Resource):

    def get(self):
        '''List all tasks'''
        api.logger.info(" hello from ns1-------------")
        api.logger.debug("debug hello from ns1-------------")
        return {"msg": "success"}

日志会记录在 flask.log 文件中

flask 中日志的基本使用,参考前面这篇https://www.cnblogs.com/yoyoketang/p/16661885.html

posted @ 2022-09-06 21:49  上海-悠悠  阅读(334)  评论(0编辑  收藏  举报