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"}
如果觉得上面的分离记录日志麻烦,可以在整个项目中使用一个全局配置。
在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