目前我正在使用puts
,但我确定这不是正确的答案。如何在我的 gem 中正确设置一个记录器来输出我的内部日志记录而不是puts
?
问问题
5857 次
4 回答
18
对于 gem 的用户来说,最灵活的方法是让他们提供一个记录器,而不是在 gem 中设置它。在最简单的情况下,这可能是
class MyGem
class << self
attr_accessor :logger
end
end
然后,您使用MyGem.logger.info "hello"
从您的 gem 记录消息(您可能希望将其包装在一个实用方法中,以测试是否设置了记录器)
然后,您的 gem 的用户可以控制消息记录到的位置(文件、系统日志、标准输出等......)
于 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)
在初始化期间,您创建一个 Logger ( @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 回答