ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-09-06 22:02:26  阅读:233  来源: 互联网

标签:RESTX logging log Flask app api ns1 ns2 logger


前言

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

标签:RESTX,logging,log,Flask,app,api,ns1,ns2,logger
来源: https://www.cnblogs.com/yoyoketang/p/16663454.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有