【问题标题】:Accessing the API logger in Flask-Restful's resources访问 Flask-Restful 资源中的 API 记录器
【发布时间】:2018-08-09 18:14:47
【问题描述】:

我目前正在使用 flask-restful (http://flask-restful.readthedocs.io/en/0.3.5/index.html) 将资源部署为端点,我想知道是否有办法从资源类中访问 API 记录器。我浏览了文档,找不到合适的答案。

基本上我想这样做:

from flask_restful import Resource 

class SomeEndpoint(Resource):

    def get(self):

        try:

            ... something throws an exception

        except SomeException as se:

            ... send custom message to API logger         <----- Here!

        return response

我想做的就是通过资源的构造函数从 API 传递记录器:

App = Flask(__name__)
api = Api(App)
api.add_resource(SomeEndpoint, '/', resource_class_kwargs={'logger': App.logger})

这是访问 flask-restful 资源端点内的记录器的最合适的方式吗?

非常感谢

【问题讨论】:

    标签: python rest flask


    【解决方案1】:

    设置 debug=False 可以暂时解决问题。

    但我真的不知道当 debug 设置为 True 时会出现什么问题

    【讨论】:

      【解决方案2】:

      我知道已经选择了答案,但有一种稍微不同的方法也有效。

      首先,导入

      from flask import current_app as app

      在资源文件中,调用记录器时,做:

      app.logger.info("This is an info message")

      【讨论】:

      • 这应该是公认的答案,因为它更干净(不要自己共享记录器!)并且更简单
      • @MartinSeeler 抱歉,但我不同意你的看法。关于API logger + constructor of Resource 的问题,但不是关于app logger 的问题。一切都取决于要求和细节。我的意思是非常不寻常的情况(特定的logger 用于特定的resources,带有自定义handlers 和级别设置等)。顺便说一句,from flask import current_app 仅在app context 可用时有效。
      • @DanilaGanchar 是的,你是对的。那不是问题。也许我太偏颇了,因为它是我案例中最干净、最简单的解决方案。
      • 这很干净,但还没有测试。
      【解决方案3】:

      您需要定义资源的constructor。举个例子:

      import logging
      
      
      class SomeEndpoint(Resource):
      
          def __init__(self, **kwargs):
              self.logger = kwargs.get('logger')
      
          def get(self):
              # self.logger - 'logger' from resource_class_kwargs
              return self.logger.name  
      
      api.add_resource(SomeEndpoint, '/', resource_class_kwargs={
          # any logger here...
          'logger': logging.getLogger('my_custom_logger')
      })
      

      打开您的端点。你会看到my_custom_logger。 希望这会有所帮助。

      【讨论】:

      • 您好,感谢您的回复,我忘了在原始问题中添加我的构造函数,但是这就是我正在做的。我只是想知道这是否是最好的方法。看起来是这样。
      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 2021-04-22
      • 2016-01-16
      • 1970-01-01
      • 2023-04-01
      • 2011-10-14
      • 2016-08-12
      • 2016-05-02
      相关资源
      最近更新 更多