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

标签 ruby-on-rails logging stdout unicorn 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

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

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

最佳答案

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

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

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

  • 添加 gem 'yell-rails'到 Gemfile
  • 运行:rails generate yell: install
  • 在文件 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 的包装器,最后一个 uses ruby Logger标准库。

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

    在这一点上,您可以通过打开这些类(TaggedLogging、BufferedLogger、Logger)中的任何一个并编写一些代码使其如您所愿地工作来获得您的成就,或者您可以使用 Rails 提供的工具替换记录器。

    rails 4

    不再使用 BufferedLogger,而是使用 ActiveSupport::Logger < Logger 代替 Logger Rails。它包含一个类方法 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))
    

    关于ruby-on-rails - 如何在 Rails 中进行拆分日志记录? (某些级别为标准输出,某些级别为标准错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520287/

    相关文章:

    ruby-on-rails - Rails中tableize和下划线之间的区别

    ruby-on-rails - Twilio 仅针对我的本地计算机返回身份验证错误

    mysql慢查询日志

    python - 在 os.dup2() 之后重定向标准输出/输入/错误

    python - Python 3 sys.stdout.fileno() 在 Python 2 中的等效项是什么

    ruby-on-rails - 如何在 Rails 中定义 postgres 函数以及它们的范围和生命周期是什么?

    ruby-on-rails - Ruby on Rails : Multiple Input Fields in The Same Form - Change ID/Value

    java - log4j2什么时候加载配置文件?

    python - 使用 python 日志记录模块将消息信息发送到一个文件并将错误发送到另一个文件

    .net - 如何避免进程终止通知和标准输出重定向事件之间的竞争条件?