如何让Rails记录我的Rack :: CommonLogger消息?

时间:2011-12-22 23:03:06

标签: ruby-on-rails ruby passenger rack rest-client

我正在使用ruby gem rest-clientrest-client-components

Rest-client-components使用Rack :: CommonLogger启用请求记录。

启用它的说明使用STDOUT:

require 'restclient/components'
RestClient.enable Rack::CommonLogger, STDOUT

这在开发中运行良好,但是当我使用Apache / Passenger(mod_rails)进行生产时,我没有在production.log中看到来自rest-client的任何消息。有没有办法将Rack :: CommonLogger与Rails日志集成?或者至少将其写入文件?前者更有用,因为它很容易看到上下文,但后者总比没有好。

感谢。

1 个答案:

答案 0 :(得分:3)

这是我提出的解决方案。 感谢@crohr指出我正确的方向。

首先,创建一个新的Logger类。 Rails默认为ActiveSupport :: BufferedLogger,因此我们将扩展它。

# lib/rest_client_logger.rb
class RestClientLogger < ActiveSupport::BufferedLogger
  def write(msg)
    add(INFO, msg)
  end
end

然后告诉Rails使用你的新记录器。

# application.rb
log_file = File.open("log/#{Rails.env}.log", 'a')
log_file.sync = true  # turn on auto-flushing at the file level so we get complete messages
config.logger = RestClientLogger.new(log_file)
config.logger.auto_flushing = !Rails.env.production?  # turn off auto-flushing at the logger level in production for better performance

最后,告诉rest-client使用您的新记录器。

# config/initializers/rest_client.rb
RestClient.enable Rack::CommonLogger, Rails.logger

限制:

如果您将Rack :: Cache与rest-client-components一起使用,则不会捕获缓存消息。