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:
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!