HTTParty中的自定义记录器格式化程序

时间:2016-06-02 09:30:49

标签: ruby logging command-line-interface httparty

我想将自动日志记录包含在我的HTTParty请求中,作为使用Thor构建的CLI应用程序的一部分。

我知道debug_output $stdout,但默认格式化程序(:apache:curl)比我想要的要多得多。我希望有极少的日志记录,只需输出请求端点,参数和响应,

PUT /users/123

{
  email: example@email.com
}

RESPONSE 201

{
  user: {
    id: 123,
    email: example@email.com
  }
}

我可以从HTTParty的规范中看到Logger有一个add_formatter方法,这让我想知道我是否可以构建一个自定义格式化程序,例如SimpleFormatter,并将它附加到我的类,如< / p>

class API
  include HTTParty
  logger ::Logger.new("my simple logger"), :debug, :SimpleFormatter
end

但是源代码中的示例格式化程序似乎没有任何子类,所以我不确定我的自定义格式化程序应遵循哪个接口。

1 个答案:

答案 0 :(得分:2)

很酷的主意。

您需要根据示例curl和apache示例实现initialize(logger, level)format(request, response)。然后,您可以将其添加到格式化程序。

你也可以使用一些属性,但它们似乎并不是强制性的。

attr_accessor :level, :logger, :current_time

我在httparty示例中玩了一下,看它是否有效,似乎工作正常。这是我的样本和输出。

<强> party.rb

require 'httparty'
require 'logger'
require './custom_formatter.rb'

HTTParty::Logger.add_formatter('custom', HTTParty::Logger::CustomFormatter)

# Or wrap things up in your own class
class StackExchange
  include HTTParty
  logger ::Logger.new("a logger"), :debug, :custom
  base_uri 'api.stackexchange.com'

  def initialize(service, page)
    @options = { query: {site: service, page: page} }
  end

  def questions
    self.class.get("/2.2/questions", @options)
  end

  def users
    self.class.get("/2.2/users", @options)
  end
end

stack_exchange = StackExchange.new("stackoverflow", 1)
puts stack_exchange.questions
puts stack_exchange.users

<强> custom_formatter.rb

module HTTParty
  module Logger
    class CustomFormatter 

      attr_accessor :level

      def initialize(logger, level)
        @logger = logger
        @level  = level.to_sym
      end

      def format(request, response)
        @logger.send @level, "hahahahaha "
      end
    end
  end
end

输出:

--> D, [2016-06-02T22:30:26.613721 #5844] DEBUG -- : hahahahaha 
--> D, [2016-06-02T22:30:27.440348 #5844] DEBUG -- : hahahahaha