Несколько 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))
Это можно сделать в файле инициализатора или непосредственно в файле конфигурации среды, однако вы предпочитаете это делать.
Довольно старый вопрос, но я просто встречаю ту же потребность, вот как я ее решил:
- Создан класс 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
- В моем файле конфигурации добавлены два моих регистратора в 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)))