This is incredibly useful when taking a first look at performance. I think facebook API calls are at least as eligible
for logging as ActiveRecord, as they take up a lot of time.
Index: facebooker/lib/facebooker/logging.rb
===================================================================
--- facebooker/lib/facebooker/logging.rb (revision 0)
+++ facebooker/lib/facebooker/logging.rb (revision 0)
@@ -0,0 +1,64 @@
+module Facebooker
+ @@logger = nil
+ def self.logger=(logger)
+ @@logger = logger
+ end
+ def self.logger
+ @logger
+ end
+
+ module Logging
+ @@row_even = false
+ def self.log_fb_api(method, params)
+ message = method # might customize later
+ dump = format_fb_params(params)
+ if block_given?
+ result = nil
+ seconds = Benchmark.realtime { result = yield }
+ log_info(message, dump, seconds)
+ result
+ else
+ log_info(message, dump)
+ nil
+ end
+ rescue Exception => e
+ # Log message and raise exception.
+ # Set last_verification to 0, so that connection gets verified
+ # upon reentering the request loop
+ exception = "#{e.class.name}: #{e.message}: #{dump}"
+ log_info(message, exception)
+ raise
+ end
+
+ def self.format_fb_params(params)
+ filtered_params = params.reject do |k, v|
+ %w(method api_key session_key call_id).index k.to_s
+ end
+ filtered_params.to_a.map { |kvp| "#{kvp[0]} = #{kvp[1]}" }.join(', ')
+ end
+
+ def self.log_info(message, dump, seconds = 0)
+ logger = Facebooker.logger || ActiveRecord::Base.logger
+ logger.info format_log_entry("#{message} (#{'%f' % seconds})", dump)
+ end
+
+ # stolen from active record
+ def self.format_log_entry(message, dump = nil)
+ if ActiveRecord::Base.colorize_logging
+ if @@row_even
+ @@row_even = false
+ message_color, dump_color = "4;36;1", "0;1"
+ else
+ @@row_even = true
+ message_color, dump_color = "4;35;1", "0"
+ end
+
+ 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
+end
\ No newline at end of file
Index: facebooker/lib/facebooker/session.rb
===================================================================
--- facebooker/lib/facebooker/session.rb (revision 479)
+++ facebooker/lib/facebooker/session.rb (working copy)
@@ -456,7 +456,7 @@
BatchRun.current_batch=nil
end
- def post(method, params = {},use_session_key=true,&proc)
+ def post(method, params = {},use_session_key=true,&proc)
add_facebook_params(params, method)
use_session_key && @session_key && params[:session_key] ||= @session_key
final_params=params.merge(:sig => signature_for(params))
@@ -463,7 +463,7 @@
if batch_request?
add_to_batch(final_params,&proc)
else
- result=service.post(final_params)
+ result = Logging.log_fb_api(method, params) { service.post(final_params) }
result = yield result if block_given?
result
end
@@ -470,9 +470,11 @@
end
def post_file(method, params = {})
- add_facebook_params(params, method)
- @session_key && params[:session_key] ||= @session_key
- service.post_file(params.merge(:sig => signature_for(params.reject{|key, value| key.nil?})))
+ Logging.log_fb_api(method, params) do
+ add_facebook_params(params, method)
+ @session_key && params[:session_key] ||= @session_key
+ service.post_file(params.merge(:sig => signature_for(params.reject{|key, value| key.nil?})))
+ end
end
Index: facebooker/lib/facebooker.rb
===================================================================
--- facebooker/lib/facebooker.rb (revision 479)
+++ facebooker/lib/facebooker.rb (working copy)
@@ -20,6 +20,7 @@
require 'digest/md5'
require 'facebooker/batch_request'
require 'facebooker/feed'
+require 'facebooker/logging'
require 'facebooker/model'
require 'facebooker/parser'
require 'facebooker/service'
|