• Flask 学习54.FlaskRESTX 结合 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

  • 相关阅读:
    locust与jmeter在压测时的比较
    通过python异步通讯方式构建高并发压力测试工具
    开博寄语
    【linux】【root权限的掌控】
    【linux】【qt5界面】【系统托盘图标的实现】
    【win】【qt5】【本地网络相关信息,诸如ip,mac等】
    【win】【qt5】【qt汉化:输入框之右键英文变中文】
    【linux】【qt5】【qt程序防多开设置,通过设置共享内存实现,超短代码,超级有效】
    【qt】【QString的诸多操作】
    【linux】【qt5】【将linux下的qt程序打包发布(完全适用于中标麒麟)】
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16663454.html
Copyright © 2020-2023  润新知