Как мне правильно войти в свой камень 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"