Rails tip #3: Filter BLOBs from ActiveRecord logging

We threw attachment_fu into our app the other day, starting off with the default :db_file setting to store images in the database. (I've been bitten by this approach before, but this time around I'm intrigued by page caching. We'll see.)

In the meantime, we've got blob after blob flying by in the script/server output, and it's messing up our Terminal fonts. No good.

Here's a quick fix, config/initializers/filter_db_files_logging.rb:

class ActiveRecord::ConnectionAdapters::AbstractAdapter
  def format_log_entry_with_db_files_filtering(message, dump = nil)
    dump = 'INSERT INTO db_files' if dump.to_s =~ /^INSERT INTO db_files/
    dump = 'UPDATE db_files'      if dump.to_s =~ /^UPDATE db_files/
    format_log_entry_without_db_files_filtering(message, dump)
  end

  alias_method_chain :format_log_entry, :db_files_filtering
end

Note that this isn't yet a general solution (other tables' blobs will still be logged), but it's good enough for our needs, and we've got a known place we can come back to should we need to filter more blobs in the future.

Also, looking at AbstractAdapter#log_info just now, we notice that could have written our own Logger and saved the monkeypatch. Maybe we'll look into doing that some day.

5 Rails tips

Each day this week, Joachim and I will post something we've learned in our time programming together. It's fun to do, and we might just win something as well.

So far, we've written:

  1. Reloadable custom FormBuilder
  2. Faking DATA in tests
  3. Filter BLOBs from ActiveRecord logging