Как мне правильно войти в свой камень Ruby?
В настоящее время я использую puts
, но я уверен, что не правильный ответ. Как правильно настроить логгер, внутри моего драгоценного камня, для вывода моего внутреннего журнала вместо puts
?
Ответы
Ответ 1
Маленький пример:
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) в файл...)
Ответ 2
Самый гибкий подход для пользователей вашего драгоценного камня - позволить им предоставить регистратор, а не устанавливать его внутри драгоценного камня. В простейшем случае это может быть
class MyGem
class << self
attr_accessor :logger
end
end
Затем вы используете MyGem.logger.info "hello"
для записи сообщений из своего драгоценного камня (вы можете обернуть его в утилите, который проверяет, установлен ли регистратор вообще)
Пользователи вашего драгоценного камня могут затем контролировать, где сообщения регистрируются (файл, syslog, stdout и т.д.)
Ответ 3
Вы можете сохранить регистратор в своем модуле верхнего уровня. Разрешить пользователю устанавливать свой собственный регистратор, но предоставлять разумные значения по умолчанию для тех, кто не имеет отношения к регистрации. Например,
module MyGem
class << self
attr_writer :logger
def logger
@logger ||= Logger.new($stdout).tap do |log|
log.progname = self.name
end
end
end
end
Затем в любом месте вашего кода драгоценного камня вы можете получить доступ к регистратору. Например,
class MyGem::SomeClass
def some_method
# ...
MyGem.logger.info 'some info'
end
end
Литература:
Ответ 4
Я думаю, что самый простой подход - использовать его таким образом
Rails.logger.info "hello"