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

Posted 上海-悠悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Flask 学习-54.Flask-RESTX 结合 namespace 使用 logging日志的主要内容,如果未能解决你的问题,请参考以下文章

flask信号

flask框架的教程--程序的基本结构[二]

五十九:Flask.Cookie之flask设置cookie过期时间

flask orm 操作方法

使用Flask在Ubuntu server 18.04中搭建web服务

使用带有 Python Flask 的 HTML 表单搜索 MongoDB 集合