Как сделать так, чтобы регистрация в rails libs работала как в моделях и контроллерах - PullRequest
1 голос
/ 21 июня 2019

До сих пор я всегда использовал «put», чтобы добавить пользовательскую информацию для регистрации в мой код.Но сейчас это своего рода боль.Когда я запускаю rspec для примера, меня не интересуют все подробности, которые я добавил с путами.Поэтому я установил «гем logging and logging-rails», потому что его установка очень быстрая и удовлетворительная.

Он хорошо работает, когда я вызываю logger из моделей и контроллера, но не когда я использую logger внутри библиотек.Я получаю эту ошибку: NameError - неопределенная локальная переменная или метод `logger 'для CustomLib: Class.

Самое простое, что мне удалось - это вызвать' Rails.logger 'вместо простого' logger '.Но таким образом в моем лог-файле класс, ссылающийся на эту строку, будет «Rails», но я хочу «CustomLib».Для моделей и контроллеров правильное имя класса отображается без какого-либо вмешательства со стороны меня.

  # config/environnement/test.rb

  # Set the logging destination(s)
  config.log_to = %w[stdout]
  config.log_level = :info

  # Show the logging configuration on STDOUT
  config.show_log_configuration = false
  # lib/custom_lib.rb
  class CustomLib
    def initialize
      Rails.logger.info 'foo'
    end
  end

Когда я буду использовать или тестировать свой класс customlib, я получу: [2019-06-21T16: 26:41] INFO Rails: foo

Вместо этого я хотел бы видеть: [2019-06-21T16: 26: 41] INFO CustomLib: foo

Я немного растерялся во всем этом журналеуправление в рельсах, я понятия не имею, что делать дальше, чтобы достичь этой цели ...

Edit

Когда я ставлю byebug прямо перед строкой "logger.info 'foo'" ивойдите в него с помощью «step», я получу два разных результата, если я нахожусь в модели / контроллере или в пользовательской библиотеке.

# In custom lib, step enters this file "gems/logging-2.2.2/lib/logging/logger.rb"
# And Rails.logger returns an object like this one beloow
Logging::Logger:0x000055a2182f8f40
  @name="Rails",
  @parent=#<Logging::RootLogger:0x000055a2182e7ee8 
    @name="root",
    @level=1>,

# In model/controller, step enters this file "gems/logging-rails-0.6.0/lib/logging/rails/mixin.rb"
# And Rails.logger returns an object like this one beloow
Logging::Logger:0x0000557aed75d7b8
  @name="Controller",
  @parent=#<Logging::RootLogger:0x0000557aedfcf630
    @name="root",
    @level=0>,

1 Ответ

0 голосов
/ 21 июня 2019

Rails в строке журнала - progname регистратора . Вы можете создать новый регистратор, который устанавливает progname на 'CustomLib' с (скажем) Rails.logger.clone.tap {|l| l.progname = 'CustomLib' }, но на самом деле это не цель progname, которая заключается в указании имени программы, а не название класса.

Вместо этого вы можете включить имя класса в строку журнала:

Rails.logger.info "[#{self.class}] - some message"

Или, если приложить немного больше усилий, вы можете определить свой собственный форматер. Вот один из них с удобным методом для упаковки существующего регистратора:

class ClassNameFormatter
  def self.wrap_logger(klass, logger)
    logger.clone.tap { |l| l.formatter = new(klass, logger.formatter) }
  end

  def initialize(klass, formatter=nil)
    @klass = klass
    @formatter = formatter ||= Logger::Formatter.new
  end

  def call(severity, timestamp, progname, msg)
    @formatter.call severity, timestamp, progname, "[#{@klass.name}] - #{msg}"
  end
end

Чтобы использовать это:

class CustomLib
  def initialize
    @logger = ClassNameFormatter.wrap_logger self.class, Rails.logger
  end

  def call
    @logger.info 'test log please ignore'
  end
end
...