【问题标题】:How do I do split logging in rails? (certain levels to stdout, and certain levels to stderr)如何在 Rails 中进行拆分日志记录? (某些级别到标准输出,某些级别到标准错误)
【发布时间】:2014-12-18 15:51:12
【问题描述】:

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

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

以便我的unicorn_app_server_stdout.logunicorn_app_server_stderr.log 填充正确类型的信息(stdout 中的 Diagnosticsstderr 中的 Errors)我相信这是 Unix

中长期存在的模型

但我似乎发现的所有 Rails 指南都在讨论将记录器定义为 logger.new(STDOUT)logger.new(STDERR) 但不是一起

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

【问题讨论】:

    标签: ruby-on-rails logging stdout unicorn stderr


    【解决方案1】:

    几个月前,我带着同样的目标研究这个话题。现在我又去调查了,我的结论是我的决定是正确的。

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

    它很容易安装并完成工作:

    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'
    

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

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

    Rails 3.2

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

    application bootstrap 记录器设置有一个ActiveSupport::TaggedLogging 实例,它是ActiveSupport::BufferedLogger 的包装器,也是std-lib 的最后一个uses ruby​​ Logger

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

    此时,您可以打开任何这些类(TaggedLogging、BufferedLogger、Logger)并编写一些代码以使其按您的意愿工作,或者您可以用 Rails 提供的工具替换记录器。

    导轨 4

    不再使用 BufferedLogger,而是使用 ActiveSupport::Logger broadcast,允许增加记录器。此方法也用于将日志发送到console

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

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

    【讨论】:

    • 不错的建议,我确实看过这颗宝石。但是在更深入地回答了为什么 rails 默认不处理这个问题或者为什么它不可能这样做。
    • #broadcast:nodoc: 所以它是供私人使用的。最好使用 Yell。
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2021-01-17
    • 2014-03-05
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多