19

現在使用してputsいますが、それは正解ではないと思います。gem内で、代わりに内部ログを出力するようにロガーを正しく設定するにはどうすればよいputsですか?

4

4 に答える 4

18

gemのユーザーにとって最も柔軟なアプローチは、gem内にロガーを設定するのではなく、ロガーを提供できるようにすることです。最も単純な場合、これは次のようになります。

class MyGem
  class << self
    attr_accessor :logger
  end
end

次にMyGem.logger.info "hello"、gemからのメッセージをログに記録するために使用します(ロガーが設定されているかどうかをテストするユーティリティメソッドでラップすることをお勧めします)

gemのユーザーは、メッセージが記録される場所(ファイル、syslog、stdoutなど)を制御できます。

于 2012-07-30T21:07:55.390 に答える
18

ロガーを最上位モジュールに保持できます。ユーザーが独自のロガーを設定できるようにしますが、ロギングを処理する必要がないユーザーには適切なデフォルトを提供します。例えば

module MyGem
  class << self
    attr_writer :logger

    def logger
      @logger ||= Logger.new($stdout).tap do |log|
        log.progname = self.name
      end
    end
  end
end

次に、gemコード内のどこからでもロガーにアクセスできます。例えば

class MyGem::SomeClass

  def some_method
    # ...
    MyGem.logger.info 'some info'
  end

end

参照:

于 2015-07-25T13:03:06.787 に答える
0

ちょっとした例:

gem 'log4r'
require 'log4r' 

class MyClass
  def initialize(name)

    @log = Log4r::Logger.new(name)
    #Add outputter
    #~ log.outputters << Log4r::FileOutputter.new('log_file', :filename => 'mini_example.log', :level => Log4r::ALL )
    log.outputters << Log4r::StdoutOutputter.new('log_stdout') #, :level => Log4r::WARN )
    #~ log.outputters << Log4r::StderrOutputter.new('log_stderr', :level => Log4r::ERROR)

    @log.level = Log4r::INFO
    @log.info("Creation")
    #~ @log.level = Log4r::OFF
  end
  attr_reader :log
  def myfunction(*par)
    @log.debug("myfunction is called")
    @log.warn("myfunction: No parameter") if par.empty?
  end
end  

x = MyClass.new('x')
x.myfunction

y = MyClass.new('y')
y.myfunction
y.myfunction(:a)
y.log.level = Log4r::DEBUG
y.myfunction(:a)

初期化中に、ロガー(@log)を作成します。メソッドでは、ロガーを呼び出します。

@log.level=(または)を使用MyClass#log.level=すると、使用するメッセージに影響を与えることができます。

さまざまな出力機能を使用できます(私の例では、STDOUTにログインします)。また、出力機能を混在させることもできます(たとえば、警告付きのSTDOUT、各データ(DEBUGを含む)をファイルに...)

于 2012-07-31T10:14:14.673 に答える
-8

最も簡単なアプローチは、このように使用することだと思います

Rails.logger.info "hello"
于 2014-02-27T14:57:28.867 に答える