如何从 Rails 日志中过滤嵌套参数
How to filter nested parameters from Rails logs
我看到我可以从 Rails 日志 here 中过滤键,但我并不完全清楚如何过滤嵌套在参数哈希中的键。
我的参数散列如下所示:
{"download"=>{"attachment_id"=>"54039", "data"=>"data:image/png;base64,iVBORw0..."}}
其中 params[:download][:data]
是 base64 字符串。这是大量数据,我想将其从我的日志中删除。
这可能吗?
我正在使用 Rails 4.0.4
我想最直接的方法是在你的 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']
只需将其放入 application.rb:
config.filter_parameters += [:data]
这也会过滤嵌套的 [:data] 键。
在rails5中,可以定义key的层级:
config.filter_parameters += ["download.data"]
这将过滤所有以 [:download] 作为直接父项的 [:data] 键。
我看到我可以从 Rails 日志 here 中过滤键,但我并不完全清楚如何过滤嵌套在参数哈希中的键。
我的参数散列如下所示:
{"download"=>{"attachment_id"=>"54039", "data"=>"data:image/png;base64,iVBORw0..."}}
其中 params[:download][:data]
是 base64 字符串。这是大量数据,我想将其从我的日志中删除。
这可能吗?
我正在使用 Rails 4.0.4
我想最直接的方法是在你的 config/initializers/filter_parameter_logging.rb
:
# 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']
只需将其放入 application.rb:
config.filter_parameters += [:data]
这也会过滤嵌套的 [:data] 键。
在rails5中,可以定义key的层级:
config.filter_parameters += ["download.data"]
这将过滤所有以 [:download] 作为直接父项的 [:data] 键。