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.Cookie之flask设置cookie过期时间