ActiveRecord干扰了Logger

4

看起来使用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"

运行这段代码将产生以下可爱的输出:
I,[2009-09-02 10:49:39#27562] INFO  - :信息
W,[2009-09-02 10:49:39#27562] WARN  - :警告
E,[2009-09-02 10:49:39#27562] ERROR  - :错误
F,[2009-09-02 10:49:39#27562] FATAL  - :严重
但是,如果我取消注释 require 'activerecord' 行,我会得到以下内容:
信息
警告
错误
严重
因此,我进行了一些搜索并查看了 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 

使用上述方法,我得到了我喜欢的输出结果。但是,这种方法对我来说似乎不太优雅和符合Ruby的风格。请问是否有更简单的方法可以得到所需的结果?
谢谢!
1个回答

6

同样的问题困扰了我一个小时,但解决方案非常简单。

ActiveSupport使用SimpleFormatter,您需要手动设置“旧”格式化程序。

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

提示:我的英语不好,请见谅 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接