Is there a way to disable SQL query logging when I'm executing commands in the console? Ideally, it would be great if I can just disable it and re-enable it with a command in the console.
I'm trying to debug something and using "puts" to print out some relevant data. However, the sql query output is making it hard to read.
Edit: I found another solution, since setting the logger to nil sometimes raised an error, if something other than my code tried to call logger.warn
Instead of setting the logger to nil
you can set the level of the logger to 1
.
ActiveRecord::Base.logger.level = 1 # or Logger::INFO
since setting the logger to nil sometimes raised an error
yap.. I got this one when trying to run rake db:migrate
stackoverflow.com/questions/1719212/…
To turn it off:
old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil
To turn it back on:
ActiveRecord::Base.logger = old_logger
Here's a variation I consider somewhat cleaner, that still allows potential other logging from AR. In config/environments/development.rb :
config.after_initialize do
ActiveRecord::Base.logger = Rails.logger.clone
ActiveRecord::Base.logger.level = Logger::INFO
end
This might not be a suitable solution for the console, but Rails has a method for this problem: Logger#silence
ActiveRecord::Base.logger.silence do
# the stuff you want to be silenced
end
For Rails 4 you can put the following in an environment file:
# /config/environments/development.rb
config.active_record.logger = nil
In case someone wants to actually knock out SQL statement logging (without changing logging level, and while keeping the logging from their AR models):
The line that writes to the log (in Rails 3.2.16, anyway) is the call to debug
in lib/active_record/log_subscriber.rb:50
.
That debug method is defined by ActiveSupport::LogSubscriber
.
So we can knock out the logging by overwriting it like so:
module ActiveSupport
class LogSubscriber
def debug(*args, &block)
end
end
end
Rails.logger.debug
statements.
Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }
. Keep in mind that monkeypatching is frowned upon by some. Probably shouldn't check this into your production code.
I used this: config.log_level = :info
edit-in config/environments/performance.rb
Working great for me, rejecting SQL output, and show only rendering and important info.
config.log_level = :fatal
it basically disables output to production log file almost completely, this is what I need since there is a custom request logger in play
In Rails 3.2 I'm doing something like this in config/environment/development.rb:
module MyApp
class Application < Rails::Application
console do
ActiveRecord::Base.logger = Logger.new( Rails.root.join("log", "development.log") )
end
end
end
Just as an FYI, in Rails 2 you can do
ActiveRecord::Base.silence { <code you don't want to log goes here> }
Obviously the curly braces could be replaced with a do end
block if you wanted.
I use activerecord 6.0.3.3 and I had to include ActiveSupport::LoggerSilence
include ActiveSupport::LoggerSilence
ActiveSupport::LoggerSilence.silence do
## everything you want to silence
end
This however did not work with anything related to creating or deleting SQL tables like ActiveRecord::Migration.drop_table
. For this to be silenced I added:
ActiveRecord::Schema.verbose = false
I had to solve this for ActiveRecord 6, and I based my answer on fakeleft
's response, but it wasn't quite right, since it was suppressing other logging such as the logging of nested views. What I did was created config/initializers/activerecord_logger.rb
:
# Suppress SQL statement logging if necessary
# This is a dirty, dirty trick, but it works:
if ENV["ACTIVERECORD_HIDE_SQL"].present?
module ActiveRecord
class LogSubscriber
def sql(event)
end
end
end
end
The log subscriber in AR 6 has a sql
event that we want to hide, so this is very narrowly targeted to skip that event.
Success story sharing
.irbrc
, which is basically.bashrc
for the Rails console. in fact you can do just about anything in.irbrc
if you want, e.g., syntax coloring, history, edit code in vi and then execute it in the Rails console, etc. check my gemutility_belt
if you're on Ruby 1.8 or the Ruby 1.9 port calledflyrb
.irbrc
is like.bashrc
but actually for your ruby interactive commandline. It's not a rails thing. I imagine you'd probably get errors if you tried to reference rails classes when you were running irb outside of a rails environment.config/initializers/activerecord_logger.rb
ActiveRecord::Base.logger.level = 1
is a much better answer as it won't raise exceptions if you use .info and others.