現在使用してputs
いますが、それは正解ではないと思います。gem内で、代わりに内部ログを出力するようにロガーを正しく設定するにはどうすればよいputs
ですか?
4 に答える
gemのユーザーにとって最も柔軟なアプローチは、gem内にロガーを設定するのではなく、ロガーを提供できるようにすることです。最も単純な場合、これは次のようになります。
class MyGem
class << self
attr_accessor :logger
end
end
次にMyGem.logger.info "hello"
、gemからのメッセージをログに記録するために使用します(ロガーが設定されているかどうかをテストするユーティリティメソッドでラップすることをお勧めします)
gemのユーザーは、メッセージが記録される場所(ファイル、syslog、stdoutなど)を制御できます。
ロガーを最上位モジュールに保持できます。ユーザーが独自のロガーを設定できるようにしますが、ロギングを処理する必要がないユーザーには適切なデフォルトを提供します。例えば
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
参照:
ちょっとした例:
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を含む)をファイルに...)
最も簡単なアプローチは、このように使用することだと思います
Rails.logger.info "hello"