如何在 Rails 中进行拆分日志记录?(某些级别为标准输出,某些级别为标准错误)

Jes*_*ham 5 logging stdout ruby-on-rails stderr unicorn

我希望能够在我的配置文件中使用 Rails 日志指定类似的内容:

logger(STDOUT).level = [:debug, :info, :warn]
logger(STDERR).level = [:error, :fatal]
Run Code Online (Sandbox Code Playgroud)

以便我的unicorn_app_server_stdout.logunicorn_app_server_stderr.log填充正确类型的信息(诊断输入stdout错误输入stderr)我相信这是Unix 中一个相当长的模型

但是我似乎找到的所有导轨指南都在谈论将记录器定义为logger.new(STDOUT)logger.new(STDERR)不在一起

大多数网络服务器具有的这种情况下stderr,并stdout但似乎只轨具有的概念stdoutstderr却不能在一起这是正确的?我是否需要使用另一个日志记录 gem 来获得此功能?或者我可以用标准导轨做到这一点吗?如果是这样怎么办?

Ale*_*bio 3

几个月前,我出于同样的目标正在研究这个主题。现在我又去考察了一下,我的结论是我的决定是正确的。

我使用 yell-rails gem,它是 gem yell 的包装。

它非常容易安装并完成以下工作:

  1. 添加gem 'yell-rails'到 Gemfile
  2. 跑步:rails generate yell: install
  3. 在文件中设置您的配置config/yell.yml

用于生产:

production:
  :adapters:
    - :file:
        :level: 'lte.warn'
        :filename: 'log/warn.log'
    - :file:
        :level: 'gte.error'
        :filename: 'log/error.log'
Run Code Online (Sandbox Code Playgroud)

此外,它还有几个很酷的选项。

编辑:这是我的研究结果:

轨道3.2

由于 Rails 使用 Rails.logger 来记录其信息,因此它提供了一个setter来在其位置使用其他记录器。在 Rails 3.2 中,记录器是一个类实例变量@@logger,因此应用程序中只允许有一个记录器。

应用程序引导时,记录器设置为 ActiveSupport::TaggedLogging 的实例,它是 ActiveSupport::BufferedLogger 的包装器,最后一个使用std-lib 的ruby​​ Logger

为了将日志发送到控制台,它使用中间件:Rails::Rack::LogTailer

此时,您可以通过打开这些类(TaggedLogging、BufferedLogger、Logger)中的任何一个并编写一些代码来使其按照您想要的方式工作,或者您可以使用 Rails 提供的工具替换记录器。

轨道4

BufferedLogger 不再使用,而是使用 ActiveSupport::Logger < Logger 代替 Logger Rails。它包括一个类方法广播,允许增加记录器。此方法还用于将日志发送到控制台

我尝试了这些设置并放入了一个初始化程序,我将其作为让您实现目标的起点:

warn = ActiveSupport::Logger.new('log/logfilewarn.log')
warn.level = Logger::DEBUG
Rails.logger.extend(ActiveSupport::Logger.broadcast(warn))

error = ActiveSupport::Logger.new('log/logfileerror.log')
error.level = Logger::ERROR
Rails.logger.extend(ActiveSupport::Logger.broadcast(error))
Run Code Online (Sandbox Code Playgroud)