每个环境下有多个config.logger的设置

5

我使用Rails 5,并且使用以下代码片段将应用程序日志发送到Papertrail,该片段位于environments/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,或者手动查看尾随日志。
2个回答

3
您可以使用自定义日志记录器扩展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))

你可以在初始化文件中完成这个操作,或者直接编辑环境配置文件,按照你的喜好进行选择。

@elyavarado。我尝试使用这个,但是当我使用Rails.logger.extend扩展syslog_logger时,它不会将日志发送到papertrail,但是当我将其分配给production.rb的config.logger时,它会将日志发送到papertrail。 - AllenC

1

这是一个有点老的问题,但我最近也遇到了同样的需求,以下是我如何解决的:

  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
在我的配置文件中,将我的两个记录器添加到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)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接