如何在Ruby gem中正确记录?

时间:2012-07-30 20:57:24

标签: ruby

目前我正在使用puts,但我确定这不是正确的答案。如何在我的gem中正确设置记录器,以输出我的内部日志而不是puts

4 个答案:

答案 0 :(得分:18)

对于gem的用户来说,最灵活的方法是让他们提供一个记录器,而不是在gem中设置它。最简单的可能是

class MyGem
  class << self
    attr_accessor :logger
  end
end

然后使用MyGem.logger.info "hello"来记录来自gem的消息(您可能希望将其包装在一个测试记录器是否完全设置的实用程序方法中)

然后,您的gem的用户可以控制消息的记录位置(文件,syslog,stdout等等)

答案 1 :(得分:15)

您可以将记录器保留在顶级模块中。允许用户设置自己的记录器,但为那些不关心记录的人提供合理的默认值。例如,

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

参考文献:

答案 2 :(得分: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)

在初始化期间,您将创建一个Logger(@log)。在您的方法中,您可以调用记录器。

使用@log.level=(或MyClass#log.level=),您可以影响使用哪些消息。

您可以使用不同的输出器(在我的示例中,我登录到STDOUT)。您还可以将输出器(例如STDOUT与警告,每个数据(包括DEBUG))混合到文件中......)

答案 3 :(得分:-6)

我认为最简单的方法是以这种方式使用

Rails.logger.info "hello"