【发布时间】:2015-05-03 12:08:35
【问题描述】:
我们希望有一个控制器集合,我们将所有操作和下游方法的记录器输出路由到单独的日志文件。这是一个 Rails 3 项目。在 Rails 2 中,我们通过重新定义“logger”方法来做到这一点,但在 Rails 3 中,记录日志的方式是使用“Rails.logger”。我试着把
Rails::logger = Logger.new(File.join(Rails.root, 'log', "reports_controller.log"), 10, 1000000)
在控制器的顶部,但只有在操作中专门使用 Rails.logger 的特定情况才会发送到指定的日志文件,控制器的所有默认日志输出仍然路由到主日志文件。
我们如何将特定控制器的所有日志输出路由到特定日志文件以包含所有默认控制器输出?
默认控制器输出,我指的是所有以入站请求开头的消息
Started POST "/api/v1/reports.json" for 10.XXX.XX.XX at 2015-03-07 01:30:22 +0000
Processing by Api::V1::ReportsController#create as JSON
Parameters: {"report"=>{"cloud_file_path"=>"report.zip", "company_id"=>nil, "created_at"=>"2015-03-07T01:30:17Z", "type_id"=>"2", "updated_at"=>"2015-03-07T01:30:17Z", "master"=>"1"}}
以及控制器中的入站请求和出站响应等可能遵循的所有日志输出。
基本上,我希望报告控制器的所有日志记录都在 reports_controller.log 中,并且我不希望报告控制器的任何流量消息显示在主日志中(即 production.log,如果在生产中)
更新:
感谢@mudasobwa 对他的回答和聊天的帮助,我能够使用中间件解决这个问题,正如他的回答所描述的那样(尽管我必须将我的 insert_before 更改为 Rails::Rack::Logger 之前)
他为我解决的修改后的答案如下,它位于config/initializers/logger_middleware.rb
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports/.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app, @logger = app, Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
@reports_api_controller_logger = Logger.new(Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE), 10, 1000000)
end
def call(env)
Rails::logger
.instance_variable_get(:@logger)
.instance_variable_set(:@log,
case env['PATH_INFO']
when REPORTS_API_CONTROLLER_PATH then
@reports_api_controller_logger
else
@logger
end
)
@app.call(env)
end
end
end
Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 logging