Skip to content

Instantly share code, notes, and snippets.

@hxx
Created August 1, 2021 11:54
Show Gist options
  • Select an option

  • Save hxx/171cdead2d05f5b886dc9814ace02cc9 to your computer and use it in GitHub Desktop.

Select an option

Save hxx/171cdead2d05f5b886dc9814ace02cc9 to your computer and use it in GitHub Desktop.
Rails Logger 输出到多个目的地(STDOUT 和 File)

Rails Logger 输出到多个目的地(STDOUT 和 File)

背景

已有的项目日志输出在 STDOUT,方便一些日志工具汇总日志,现在想增加其他的日志分享工具却又需要从文件中读取日志,如何在保持日志输出到STDOUT的同时增加输出到文件中呢?

解决方法

https://guides.rubyonrails.org/initialization.html#rails-server-start

def log_to_stdout
  wrapped_app # touch the app so the logger is set up

  console = ActiveSupport::Logger.new(STDOUT)
  console.formatter = Rails.logger.formatter
  console.level = Rails.logger.level

  unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDOUT)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
  end
end

我们在 Rails 的初始化过程中,可以看到 log_to_stdout 方法中, 有将日志扩展到新创建的 STDOUT,因此我们可以仿照这个方法,先创建一个 File 日志, 然后将日志扩展到该文件中,即可实现将 Rails Logger 输出到多个目的地。

file_logger = ActiveSupport::Logger.new("log/#{Rails.env}.log")
Rails.logger.extend(ActiveSupport::Logger.broadcast(file_logger))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment