如何在rails中进行拆分日志记录?(stdout的某些级别,stderr的某些级别)



我希望能够在带有rails日志的配置文件中指定这样的内容:

logger(STDOUT).level = [:debug, :info, :warn]
logger(STDERR).level = [:error, :fatal]

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

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

大多数Web服务器都有stderrstdout的上下文,但rails似乎只有stdoutstderr的概念,但不在一起,这是正确的吗?我需要使用另一个日志宝石来获得此功能吗?或者我可以用标准导轨来做这件事吗?如果是,怎么办?

几个月前,我怀着同样的目标研究这个主题。现在我又去调查了一次,得出的结论是我做了正确的决定。

我用的是yellrails宝石,它是宝石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'

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

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

轨道3.2

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

在应用程序引导程序中,记录器设置有ActiveSupport::TaggedLogging的一个实例,该实例是ActiveSupport::BufferedLogger的包装器,最后一个使用std-lib的ruby logger。

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

在这一点上,您可以通过打开这些类中的任何一个(TaggedLogging、BufferedLogger、Logger)并编写一些代码来实现您想要的工作,或者您可以用Rails提供的工具替换记录器。

轨道4

不再使用BufferedLogger,而是使用ActiveSupport::Logger<记录器。它包括一个类方法广播,允许对记录器进行乘法运算。此外,此方法用于将日志发送到控制台。

我玩了这些设置,并放入了一个初始值设定项,我把它作为让你实现目标的起点:

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))

相关内容

  • 没有找到相关文章

最新更新