如何从Rails日志中过滤嵌套参数

时间:2015-03-21 09:19:59

标签: ruby-on-rails logging actiondispatch

我看到我可以从Rails日志here中过滤密钥,但我不清楚如何过滤嵌套在参数哈希中的密钥。

我的params哈希看起来像这样:

{"download"=>{"attachment_id"=>"54039", "data"=>"data:image/png;base64,iVBORw0..."}}

其中params[:download][:data]是base64字符串。这是一个大量的数据,我想从我的日志中删除它。

这可能吗?

我使用的是Rails 4.0.4

2 个答案:

答案 0 :(得分:8)

只需将其放在application.rb中:

  

config.filter_parameters + = [:data]

这也会过滤嵌套的[:data]键。

在rails 5中,您可以定义密钥的层次结构:

  

config.filter_parameters + = [" download.data"]

这将过滤所有[:data]键,其中[:download]为直接父级。

答案 1 :(得分:0)

我想最直接的方法是在config/initializers/filter_parameter_logging.rb中使用monkeypatch Rails代码进行参数过滤:

# monkeypatch to filter nested parameters
class ActionDispatch::Http::ParameterFilter::CompiledFilter
  def call(original_params, path = [])
    filtered_params = {}

    original_params.each do |key, value|
      if regexps.any? { |r| key =~ r || (path + [key]).join('/') =~ r  }
        value = ActionDispatch::Http::ParameterFilter::FILTERED
      elsif value.is_a?(Hash)
        value = call(value, path + [key])
      elsif value.is_a?(Array)
        value = value.map { |v| v.is_a?(Hash) ? call(v, path + [key]) : v }
      elsif blocks.any?
        key = key.dup
        value = value.dup if value.duplicable?
        blocks.each { |b| b.call(key, value) }
      end

      filtered_params[key] = value
    end

    filtered_params
  end
end

然后:

Rails.application.config.filter_parameters += ['download/data']