Несколько config.logger для каждой среды

Я использую Rails 5 и отправляю журналы приложений на papertrail с помощью этого фрагмента в моей среде /production.rb

config.logger = ActiveSupport::TaggedLogging.new(
  RemoteSyslogLogger.new(
    'logs6.papertrailapp.com', 41364,
    program: "rails-#{Rails.env}"
  )
)

Иногда происходит задержка отправки журналов на papertrail, поэтому я делаю tail -f production.log вручную, но это ничего не показывает, так как журналы отправлялись на papertrail.

Для просмотра логов с хвостами мне нужно заменить config.logger на

config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(File.join(Rails.root, "log", "#{Rails.env}.log")))

Есть ли способ в Rails, чтобы я мог использовать несколько регистраторов в одной среде? Как правило, я хочу отправлять журналы на papertrail или просматривать журналы вручную, используя хвостовые журналы?

1 ответ

Вы можете расширить Rails.logger с помощью своего собственного регистратора:

syslog_logger = ActiveSupport::TaggedLogging.new(
  RemoteSyslogLogger.new(
    'logs6.papertrailapp.com', 41364,
    program: "rails-#{Rails.env}"
  )
)
Rails.logger.extend(ActiveSupport::Logger.broadcast(syslog_loger))

Это можно сделать в файле инициализатора или непосредственно в файле конфигурации среды, однако вы предпочитаете это делать.

Довольно старый вопрос, но я просто встречаю ту же потребность, вот как я ее решил:

  1. Создан класс LoggerProxy для переадресации вызова нескольким регистраторам:
class LoggerProxy
  def initialize
    @loggers = Set.new
  end

  def add(logger)
    @loggers.add(logger)
  end

  def remove(logger)
    @loggers.delete(logger)
  end

  def method_missing(name, *args, &block)
    @loggers.each do |logger|
      logger.public_send(name, *args, &block)
    end
  end
end
  1. В моем файле конфигурации добавлены два моих регистратора в LoggerProxy:
config.logger = LoggerProxy.new
config.logger.add(Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 10, 50.megabytes))
config.logger.add(ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)))
Другие вопросы по тегам