我希望能够在带有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中是一个相当长期的模型
但我似乎找到的所有轨道指南都在讨论将记录器定义为logger.new(STDOUT)
或logger.new(STDERR)
,而不是一起定义
大多数Web服务器都有stderr
和stdout
的上下文,但rails似乎只有stdout
或stderr
的概念,但不在一起,这是正确的吗?我需要使用另一个日志宝石来获得此功能吗?或者我可以用标准导轨来做这件事吗?如果是,怎么办?
几个月前,我怀着同样的目标研究这个主题。现在我又去调查了一次,得出的结论是我做了正确的决定。
我用的是yellrails宝石,它是宝石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'
此外,它还有几个很酷的选项。
编辑:这是我研究的结果:
轨道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))