Make your library a better citizen
I’ve recently ran into a case where I wanted the Rails logger to be at :debug
level, but really didn’t care about the debug output from the Hoptoad plugin. It kept giving a big XML dump every time it reported an exception which just added noise to the log file that wasn’t relevant.
I’ve found many plugins including Dash (may it rest in peace) and Hoptoad who would steal the logger from Rails and reference that internally.
Here’s the logger in hoptoad:
# Look for the Rails logger currently defined
def logger
if defined?(Rails.logger)
Rails.logger
elsif defined?(RAILS_DEFAULT_LOGGER)
RAILS_DEFAULT_LOGGER
end
end
Many times it’s useful to run your staging environment (or even production) with debug logging enabled, but the downside was that now all of these plugins would be logging at that level as well.
One little change that plugin authors can start to do to help the rest of us out is make sure you #dup
the logger before you grab a copy.
def logger
@logger ||= if defined?(Rails.logger)
Rails.logger.dup
elsif defined?(RAILS_DEFAULT_LOGGER)
RAILS_DEFAULT_LOGGER.dup
end
end
This would allow us to then say:
Hoptoad.logger.level = Logger::WARN
and escape all of the noise from plugins that we don’t care about.
Much thanks to Bruce Williams for first proposing this trick.