Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 在Rails 4中为特定控制器重定向记录器输出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经建立了一个解决方案,基于我以前的问题 Redirect logger output for a specific controller in Rails 3 for Rails 3中的答案.它的效果非常好,但是现在我正在尝试将相同的基于中间件的解决方案应用于Rails 4项目,但是有一些差异,保持相同的解决方案不工作.

Rails 3解决方案:

@H_181_4@module MyApp class LoggerMiddleware REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*| REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log" def initialize(app) @app = app @logger = 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

在上面:

Rails 3 getter for Rails.logger = Rails :: logger.instance_variable_get(:@ l​​ogger).instance_variable_get(:@ l​​og)

Rails 3 setter for Rails.logger(设置为@my_logger)= Rails :: logger.instance_variable_get(:@ l​​ogger).instance_variable_set(:@ l​​og,@ my_logger)

有一件事我马上注意到,在Rails 4中,上面的Rails :: logger.instance_variable_get(:@ l​​ogger).instance_variable_get(:@ l​​og)返回nil.

检查Rails 4控制台,我看到Rails.instance_variable_get(:@ l​​ogger)返回#< ActiveSupport :: Logger:0x007f84ff503a08 ....>

我已经尝试用Rails.instance_variable_get(:@ l​​ogger)和setter与Rails.instance_variable_set(:@ l​​ogger,my_logger)替换getter,几乎似乎工作.活动的第一部分“开始…”转到新的日志文件,但之后的所有内容都将转到默认日志文件(Rails.logger在中间件更改之前).

Rails.instance_variable_get(:@ l​​ogger)不是Rails 4中最低级别的Rails 3 Rails :: logger.instance_variable_get(:@ l​​ogger).instance_variable_get(:@ l​​og)用于获取/设置rails.logger或那里是在我的中间件在我设置之后覆盖它的过程中的其他事情.

任何线索?

更新:

要澄清,上面发布的解决方案按照Rails 3的预期工作.在特殊环境中可能或可能没有的限制(例如,如果解决方案可能无法在线程服务器环境中运行)在这一点上是可以的,在这个时候没有经验的障碍,因此在这个问题的Rails 4解决方案中,这些限制也是一样.

解决方法

在围绕Rails代码进行一天的攻击之后,我想我已经找到了一个hack-ish解决您的问题.

您需要编辑调用方法并初始化方法如下:

def initialize(app)
  @app = app
  @logger = Rails.instance_variable_get(:@logger)
  @reports_api_controller_logger = Logger.new(
      Rails.root.join('log',1000000)
end

def call(env)
  if env['PATH_INFO'] =~ /api\/v.*\/reports.*/
    Rails.instance_variable_set(:@logger,@reports_api_controller_logger)
    ActionController::Base.logger = @reports_api_controller_logger
    ActiveRecord::Base.logger = @reports_api_controller_logger
    ActionView::Base.logger = @reports_api_controller_logger
  else
    Rails.instance_variable_set(:@logger,@logger)
    ActionController::Base.logger = @logger
    ActiveRecord::Base.logger = @logger
    ActionView::Base.logger = @logger
  end
  @app.call(env)
end

这真的是一个hack-ish解决方案,并根据您的需要修改正则表达式.

告诉我,如果这不适合你.

大佬总结

以上是大佬教程为你收集整理的ruby-on-rails – 在Rails 4中为特定控制器重定向记录器输出全部内容,希望文章能够帮你解决ruby-on-rails – 在Rails 4中为特定控制器重定向记录器输出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。