Skip to content

Instantly share code, notes, and snippets.

@belt
Created August 10, 2011 16:33
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save belt/1137342 to your computer and use it in GitHub Desktop.
Save belt/1137342 to your computer and use it in GitHub Desktop.
QueryTrace... ported to rails3
require 'term/ansicolor'
# yeilds a stacktrace for each SQL query
# put this file in config/initializers
class QueryTrace < ActiveSupport::LogSubscriber
include Term::ANSIColor
attr_accessor :trace_queries
def sql(event) #:nodoc:
return unless QueryTrace.enabled? && logger.debug? && Rails.env.development?
stack = Rails.backtrace_cleaner.clean(caller)
first_line = stack.shift
return unless first_line
msg = prefix + bold + cyan + "#{first_line}\n" + reset
msg += cyan + stack.join("\n") + reset
debug msg
end
# :call-seq:
# Klass.enabled?
#
# yields boolean if SQL queries should be logged or not
def self.enabled?
defined?(@trace_queries) && @trace_queries
end
# :call-seq:
# Klass.status
#
# yields text if QueryTrace has been enabled or not
def self.status
QueryTrace.enabled? ? 'enabled' : 'disabled'
end
# :call-seq:
# Klass.enable!
#
# turn on SQL query origin logging
def self.enable!
@trace_queries = true
end
# :call-seq:
# Klass.disable!
#
# turn off SQL query origin logging
def self.disable!
@trace_queries = false
end
# :call-seq:
# Klass.toggle!
#
# Toggles query tracing yielding a boolean indicating the new state of query
# origin tracing
def self.toggle!
enabled? ? disable! : enable!
enabled?
end
protected
def prefix #:nodoc:
bold(magenta('Called from: ')) + reset
end
end
QueryTrace.attach_to :active_record
trap('QUIT') do
# Sending 2 backspace characters removes the ^\ that is
# printed to the console.
rm_noise = "\b\b"
QueryTrace.toggle!
puts "#{rm_noise}=> QueryTrace #{QueryTrace.status}"
end
QueryTrace.enable! if ENV['QUERY_TRACE']
puts "=> QueryTrace #{QueryTrace.status}; CTRL-\\ to toggle"
@aokolish
Copy link

aokolish commented Feb 5, 2012

Thanks for this. I had to add gem 'term-ansicolor' to my gemfile to get it working.

@jasonfb
Copy link

jasonfb commented Mar 27, 2012

For rails 3 see this as an alternative https://github.com/flyerhzm/bullet

@flori
Copy link

flori commented Nov 6, 2012

Holy shit, you guys shouldn't trap QUIT without actually quitting afterwards…

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