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