在Rails中寻求更细粒度的日志记录选项。如何将整个请求和/或单个过滤器记录到备用日志文件中?

时间:2011-10-19 13:52:35

标签: ruby-on-rails-3

这是一个两部分问题,但可能有相同的答案。

第一部分: 在我们的应用程序中,一个特定的控制器被很多 - 这么多,所以我们希望将它记录在与所有其他请求分开的文件中。设置FoosController.logger不是我正在寻找的,因为请求会运行一些具有其logger对象的lib文件和活动记录对象,rails会在将控制权交给相关控制器之前记录一些信息。

第二部分: 我们的根application_controller.rb中包含一个全局的前置过滤器,它在大多数控制器的大多数操作之前运行。这个before_filter在日志中非常冗长,并且是将所有日志信息发送到单独文件的候选者。此过滤器之前还会调用libs和ActiveRecord代码,并使用它们自己对记录器的引用。

一种可能的解决方案是将单个控制器作为自己的独立应用程序运行。我还没有尝试过,因为它与app的内部结合在一起。这种方法对before_filter也无济于事。

对于rails应用程序中更精细的日志记录,是否有任何好的解决方案?

谢谢!

3 个答案:

答案 0 :(得分:1)

第一部分 我建议您创建自己的记录器类(可能继承自ruby logger(1),让记录器过滤掉请求URL并根据该日志记录到特定文件。

第二部分 最简单的解决方案是为这些方法使用单独的记录器。而不是logger.debug“你的消息”,你只需要调用method_logger.debug“你的消息”。

创建自己的记录器很简单,只需使用ruby logger类(1)。以下代码创建一个记录器,该记录器记录到rails应用程序的logs目录中的my_method.log文件。

method_logger = Logger.new(Rails.root.join('logs','my_method.log')

然后,您可以使用以下命令写入日志,这看起来很熟悉,因为rails也使用Ruby记录器。

method_logger.debug "your debug message here"

(1)http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html

答案 1 :(得分:1)

以下是您可以用来解决第一部分的自定义记录器的代码。我从another Stack Overflow question改编了它以供我自己使用,甚至包括回答者的内联注释。主要区别在于您可以为开发和生产指定不同的日志路径:

# app/concerns/event_notifications_logger.rb
class EventNotificationsLogger < Rails::Rack::Logger
  def initialize(app, opts = {})
    @default_logger = Rails.logger

    @notifications_logger = Logger.new(notifications_log_path)
    @notifications_logger.formatter = LogFormat.new
    @notifications_logger.level = @default_logger.level

    @app = app
    @opts = opts
  end

  def call(env)
    logger = if env['PATH_INFO'] == '/event_notifications/deliver'
      @notifications_logger
    else
      @default_logger
    end

    # What?! Why are these all separate?
    ActiveRecord::Base.logger = logger
    ActionController::Base.logger = logger
    Rails.logger = logger

    # The Rails::Rack::Logger class is responsible for logging the
    # 'starting GET blah blah' log line. We need to call super here (as opposed
    # to @app.call) to make sure that line gets output. However, the
    # ActiveSupport::LogSubscriber class (which Rails::Rack::Logger inherits
    # from) caches the logger, so we have to override that too
    @logger = logger

    super
  end

private

  def notifications_log_path
    Rails.env.production? ?  '/var/log/event-notifications.log' : Rails.root.join('log/event-notifications.log')
  end
end

然后将其包含在您的应用程序配置中:

require File.expand_path('../boot', __FILE__)
require 'rails/all'

require File.expand_path('../../app/concerns/event_notifications_logger', __FILE__)

module YourApp
  class Application < Rails::Application
    config.middleware.swap Rails::Rack::Logger, EventNotificationsLogger
    # ...
  end
end

答案 2 :(得分:0)

Rails 3.2为日志提供过滤器选项,称为&#34;标记日志记录&#34;。

请参阅announcementnew Rails 3.2 guide on ActiveSupport