【问题标题】:How to filter nested parameters from Rails logs如何从 Rails 日志中过滤嵌套参数
【发布时间】:2015-03-21 09:19:59
【问题描述】:

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

我的参数哈希看起来像这样:

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

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

这可能吗?

我使用的是 Rails 4.0.4

【问题讨论】:

  • 你试过config.filter_parameters << {download: :data} 吗?
  • 这种方式行不通。它应该以字符串而不是散列的形式使用。对于这种情况,config.filter_parameters += ["download.data"],正如该问题已接受的回答者所指出的那样

标签: ruby-on-rails logging actiondispatch


【解决方案1】:

只需把它放在 application.rb 中:

config.filter_parameters += [:data]

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

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

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

这将过滤所有以 [:download] 作为直接父级的 [:data] 键。

【讨论】:

  • 嗯,效果很好,但我可以指定 download 必须是顶级键吗?
  • 没有。但是在 Rails 5 中,您可以定义下载应该是特定父键的子键。详情看这里github.com/rails/rails/pull/13897
【解决方案2】:

我想最直接的方法是在 config/initializers/filter_parameter_logging.rb 中为参数过滤的 Rails 代码添加monkeypatch:

# 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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2017-06-19
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多