5

我正在使用 Rails 5,并在我的环境/production.rb上使用此代码段将应用程序日志发送到papertrail

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 或使用有尾日志手动查看日志?

4

2 回答 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))

您可以在初始化程序文件中执行此操作,也可以直接在您的环境配置文件中执行此操作,但您更愿意这样做。

于 2018-04-27T04:21:12.230 回答
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
  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)))
于 2020-08-03T00:10:09.140 回答