我希望能够在我的配置文件中使用 Rails 日志指定类似的内容:
logger(STDOUT).level = [:debug, :info, :warn]
logger(STDERR).level = [:error, :fatal]
让我
unicorn_app_server_stdout.log
和unicorn_app_server_stderr.log
与正确的信息填充(诊断在stdout
和错误在stderr
)我相信这是一个相当长期的模型的Unix 但是我似乎找到的所有 rails 指南都在谈论将记录器定义为
logger.new(STDOUT)
或 logger.new(STDERR)
但不是一起大多数网络服务器都有
stderr
和 stdout
的上下文,但 Rails 似乎只有 stdout
或 stderr
的概念,但不是在一起,这是正确的吗?我是否需要使用另一个日志记录 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/