Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@bogdan
Created February 27, 2011 11:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bogdan/846102 to your computer and use it in GitHub Desktop.
Save bogdan/846102 to your computer and use it in GitHub Desktop.
require "net/http"
class Net::HTTP
alias_method :request_without_log, :request
def request(request, body = nil, &block)
time = Time.now
response = request_without_log(request, body, &block)
response
ensure
if self.started?
url = "http#{"s" if self.use_ssl?}://#{self.address}:#{self.port}#{request.path}"
ofset = Time.now - time
rails_log("HTTP #{request.method} (%0.2fms)" % (ofset * 1000), url)
rails_log("POST params", request.body) if request.is_a?(::Net::HTTP::Post)
if defined?(response) && response
rails_log("Response status", "#{response.class} (#{response.code})")
body = response.body
rails_log("Response body", body) unless body.is_a?(Net::ReadAdapter)
end
end
end
def rails_log(message, dump)
if defined?(Rails)
Rails.logger.debug(format_log_entry(message, dump))
end
end
def format_log_entry(message, dump = nil)
if ActiveRecord::Base.colorize_logging
message_color, dump_color = "4;32;1", "0;1"
log_entry = " \e[#{message_color}m#{message}\e[0m "
log_entry << "\e[#{dump_color}m%#{String === dump ? 's' : 'p'}\e[0m" % dump if dump
log_entry
else
"%s %s" % [message, dump]
end
end
end
@ayanko
Copy link

ayanko commented Mar 7, 2011

  1. Rails3 is ORM agnostic so ActiveRecord::Base may be not used

  2. Deprecation:
    ruby-1.8.7-p330 :007 > ActiveRecord::Base.colorize_logging
    => "DEPRECATION WARNING: ActiveRecord::Base.colorize_logging and config.active_record.colorize_logging are deprecated. Please use Rails::LogSubscriber.colorize_logging or config.colorize_logging instead. (called from irb_binding at (irb):7)"

Use ActiveSupport::LogSubscriber.colorize_logging

  1. Why Rails dependent?
    More generic:

# Usage:
#
#    require 'net/http/logging'
#
# == Class level
#
#    Net::HTTP.logger = Logger.new('/tmp/all.log')
#
# == Instance level
#
#     res = Net::HTTP.start(url.host, url.port) { |http|
#       http.logger = Logge.new('/tmp/instance.log')
#       http.request(req)
#     }
#     ...

# lib/net/http/logging.rb

require 'net/http'

module Net::HTTP::Logging
  class << self
    def self.included(base)
      base.send :extend, ClassMethods
      base.class_eval do
        alias_method :request_without_logging, :request
      end
    end
  end

  module ClassMethods
    attr_accessor :logger
  end

  attr_accessor :logger

  def initialize(*)
    super
    @logger = self.class.logger
  end

  def request(request, body = nil, &block)
    time = Time.now
    response = request_without_logging(request, body, &block)
    response
  ensure
    if self.started? && self.logger
    # ....
    end
  end

end

class Net::HTTP
  include Logging
end

if defined?(Rails.logger)
  Net::HTTP.logger = Rails.logger
end


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment