ActiveRecord (ActiveSupport が必要) を使用すると、Logger クラスが混乱し、問題が発生するようです。これは、いくつかのサンプル コードで確認できます。
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"
このコードを実行すると、次の素敵な出力が生成されます。
私、[2009-09-02 10:49:39#27562] 情報 -- : 情報 W、[2009-09-02 10:49:39#27562] WARN -- : 警告する E、[2009-09-02 10:49:39#27562] エラー --: エラー F、[2009-09-02 10:49:39#27562] 致命的 -- : 致命的
ただし、require 'activerecord' 行のコメントを外すと、代わりに次のようになります。
情報 暖かい エラー 致命的
だから私はアクティブサポートについて調べた後、いくつか検索しました:
次の「実用的なソリューション」を見つけました
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
上記を使用して、私が好きな出力を取得します。しかし、それは私には粗末でRubyらしくないように思えます。望ましい結果を得るためのより簡単な方法があるかどうかは誰にもわかりませんか?
ありがとう!