4 Stimmen

ActiveRecord interferiert mit Logger

Es scheint, dass die Verwendung von ActiveRecord (das ActiveSupport erfordert) die Logger-Klasse durcheinander bringt, was zu Schwierigkeiten führt. Dies kann anhand eines Beispielcodes gezeigt werden:

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"

Wenn Sie diesen Code ausführen, erhalten Sie diese schöne Ausgabe:

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

Wenn ich jedoch die Zeile require 'activerecord' auskommentiere, erhalte ich stattdessen Folgendes:

info
warn
error
fatal 

Also habe ich ein wenig gesucht, und nachdem ich bei activesupport nachgeschaut habe:

logger.rb

Ich habe die folgende "funktionierende Lösung" gefunden

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 

Mit der oben genannten Methode erhalte ich das Ergebnis, das mir gefällt. Allerdings, das scheint mir grob und unRubylike. Weiß jemand, ob es einen einfacheren Weg, um das gewünschte Ergebnis zu erhalten?

Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X