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"

このコードを実行すると、次の素敵な出力が生成されます。

私、[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' 行のコメントを外すと、代わりに次のようになります。

情報
暖かい
エラー
致命的

だから私はアクティブサポートについて調べた後、いくつか検索しました:

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らしくないように思えます。望ましい結果を得るためのより簡単な方法があるかどうかは誰にもわかりませんか?

ありがとう!

4

1 に答える 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

Ps: 私の英語が下手でごめんなさい :)

于 2009-12-08T12:47:23.987 に答える