2016-06-02 17 views
1

Ich möchte die automatische Protokollierung auf meine HTTParty-Anforderungen als Teil einer mit Thor erstellten CLI-App einbeziehen.Benutzerdefinierter Logger-Formatierer in HTTParty

Ich bin bewusst, debug_output $stdout, aber die Standard Formatierer (:apache und) tun so viel mehr als ich will. Ich mag sehr minimale Protokollierung haben, die nur die Anforderung Endpunkt ausgibt, params, und die Antwort, nach dem Vorbild der

PUT /users/123 

{ 
    email: [email protected] 
} 

RESPONSE 201 

{ 
    user: { 
    id: 123, 
    email: [email protected] 
    } 
} 

ich von HTTParty specs sehen kann, dass der Logger eine add_formatter Methode hat, das mich fragen, ob ich einen benutzerdefinierten Formatierer aufbauen können, zB SimpleFormatter, und befestigen sie es mit etwas zu meiner Klasse wie

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

aber das Beispiel Formatierer in der Quelle scheint nichts zu Unterklasse, also bin ich nicht sicher, welche Schnittstelle Mein benutzerdefinierter Formatierer sollte dies berücksichtigen.

Antwort

2

Coole Idee.

Sie müssen initialize(logger, level) und format(request, response) nach den Proben curl und Apache Proben implementieren. Dann können Sie es den Formatierern hinzufügen.

Es gibt einige Eigenschaften, die Sie auch verwenden können, aber sie scheinen nicht obligatorisch zu sein.

attr_accessor :level, :logger, :current_time 

Ich hatte ein kleines Spiel mit dem httparty Beispiel, um zu sehen, ob es funktioniert, scheint gut zu funktionieren. Hier ist meine Probe und Ausgabe.

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 

output:

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