gpt4 book ai didi

ruby-on-rails - 重定向 Rails 3 中特定 Controller 的记录器输出

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:04 30 4
gpt4 key购买 nike

我们想要一个 Controller 集合,我们将所有操作和下游方法的记录器输出路由到一个单独的日志文件。这是一个 Rails 3 项目。在 Rails 2 中,我们通过重新定义“logger”方法来做到这一点,但在 Rails 3 中,记录的方式是使用“Rails.logger”。我试着把

Rails::logger = Logger.new(File.join(Rails.root, 'log', "reports_controller.log"), 10, 1000000) 

在 Controller 的顶部,但只有在操作中专门使用 Rails.logger 的特定情况才会发送到指定的日志文件, Controller 的所有默认日志输出仍然路由到主日志文件。

我们如何将特定 Controller 的所有日志输出路由到特定日志文件以包含所有默认 Controller 输出?

默认 Controller 输出,我指的是所有从入站请求开始的消息

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"}}

以及 Controller 中入站请求和出站响应的所有日志输出等。

基本上,我希望报告 Controller 的所有日志记录都在 reports_controller.log 中,并且我不希望报告 Controller 的任何流量消息显示在主日志中(即生产中的 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

最佳答案

您是否尝试过在 around_filter 之前添加?

class MyController < ApplicationController
prepend_around_filter :set_logger

private

def set_logger
old_logger = Rails::logger
Rails::logger = Logger.new(Rails.root.join('log', "reports_controller.log"), 10, 1000000)
yield
Rails.logger = old_logger
end
end

关于ruby-on-rails - 重定向 Rails 3 中特定 Controller 的记录器输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28821668/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com