ActiveRecord interferring with Logger

It appears that using ActiveRecord (which requires ActiveSupport) messes with the Logger class, resulting in difficulties in a non-Rails ActiveRecord-using project. This can be seen with some example code:

require 'rubygems' #require 'activerecord' require 'logger'

log = Logger.new(STDERR) log.sev_threshold = Logger::INFO log.datetime_format = "%Y-%m-%d %H:%M:%S"

log.debug "debug" log.info "info" log.warn "warn" log.error "error" log.fatal "fatal"

Running this code will produce this lovely output:

I, [2009-09-02 10:49:39#27562] INFO -- : info W, [2009-09-02 10:49:39#27562] WARN -- : warn E, [2009-09-02 10:49:39#27562] ERROR -- : error F, [2009-09-02 10:49:39#27562] FATAL -- : fatal

However, if I uncomment the require 'activerecord' line, I instead get this less beautiful output:

info warn error fatal

So I did some searching about and after looking at activesupport's logger.rb http://github.com/rails/rails/blob/669fd84910586d4c791b6f5bf4320f68ac7845aa/activesupport/lib/active_support/core_ext/logger.rb

I found the following "working solution"

log = Logger.new(STDERR) log.sev_threshold = Logger::INFO log.datetime_format = "%Y-%m-%d %H:%M:%S" class Formatter       Format = "%s, [%s#%d] %5s -- %s: %s\n"

      attr_accessor :datetime_format

      def initialize         @datetime_format = nil       end

      def call(severity, time, progname, msg)         Format % [severity[0..0], format_datetime(time), $$, severity, progname, msg2str(msg)]       end

      private         def format_datetime(time)           if @datetime_format.nil?              time.strftime("%Y-%m-%dT%H:%M:%S.") << "%06d " % time.usec           else             time.strftime(@datetime_format)           end         end

        def msg2str(msg)           case msg           when ::String             msg           when ::Exception             "#{ msg.message } (#{ msg.class })\n" <<             (msg.backtrace || ).join("\n")           else             msg.inspect           end         end end f=Formatter.new f.datetime_format = "%Y-%m-%d %H:%M:%S" log.formatter=f

Using the above, I get the output that I like. However, that seems to me gross and unRubylike, probably not even guarranteed to continue working when I upgrade to a newer version of ActiveRecord. Does anyone know if there is an easier and smarter way to get the desired result?

Many Thanks!

Rohit