2009-09-03 2 views
4

Похоже, что использование ActiveRecord (которое требует ActiveSupport) беспорядочно с классом Logger, что приводит к трудностям. Это можно увидеть с некоторыми примерами кода:ActiveRecord вмешивается в 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" 

Выполнение этого кода будет производить этот прекрасный выход:

 
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 

Однако, если я раскомментировать строку требуется «ActiveRecord», вместо этого я получаю это:

 
info 
warn 
error 
fatal 

Так что я сделал некоторые поиски и о посмотрев на ActiveSupport:

logger.rb

Я нашел следующее «рабочий раствор»

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 

Использование выше, я получаю вывод, что мне нравится. Однако это кажется мне грубым и unRubylike. Кто-нибудь знает, есть ли более простой способ получить желаемый результат?

Спасибо!

ответ

6

Эта же проблема прослушивала меня в последний час, но решение довольно простое.

ActiveSupport использует SimpleFormatter, вам нужно установить «старый» Formatter вручную.

require 'rubygems' 
require 'active_support' 
require 'logger' 

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

Ps: Sry мой плохой английский :)

Смежные вопросы