首页 > 解决方案 > 如何告诉 Rails 绕过记录在特定日志中的参数过滤器

问题描述

我使用 Rails过滤器参数不打印日志中的城市和州。

Rails.application.config.filter_parameters += [:city, :state]

但是,我有一个自定义日志被错误地过滤,我需要它来打印:

Rails.logger.info("Transaction state has changed.", state: transaction.state) 

如何强制此哈希绕过参数过滤?

标签: ruby-on-rails

解决方案


我不相信有一种方法可以忽略特定的过滤器,但是您可以使过滤器不那么通用。它们比看起来更通用。


中的每个条目Rails.application.config.filter_parameters实际上都是ActiveSupport::ParameterFilter.new.

这需要两种类型的过滤器:Regexes 和 Proc。其他所有内容都转换为正则表达式。

Rails.application.config.filter_parameters += [:city, :state]真的是很笼统Rails.application.config.filter_parameters += [/city/i, /state/i]。这将匹配state_of_mindspecificity这可能不是您的想法。

pf = ActiveSupport::ParameterFilter.new([:city, :state])
p pf.filter({specificity: 42, state_of_mind: "confused"})

# {:specificity=>"[FILTERED]", :state_of_mind=>"[FILTERED]"}

您可以将特定型号与model.param.

Rails.application.config.filter_parameters += ["user.city", "user.state"]

这将匹配{ user: { state: "..."} }( user.state) 而不是{ transaction: { state: "..." } }( transaction.state)。

但是,这些仍然是未锚定的正则表达式匹配,因此它将匹配 { admin_user: { state_of_mind: "..." } }( admin_user.state_of_mind)。

为避免这种情况,请使用完整的正则表达式。

Rails.application.config.filter_parameters += [/^user\.(city|state)$/]

您还可以使用功能进行更多控制。这需要键、值和原始参数。这些有点尴尬。

  • “钥匙”只是直接钥匙,所以{ transaction: { state: "..." } }只会得到:state.
  • 值本身必须更改。
Rails.application.config.filter_parameters << ->(key,value,original_params) do
  p key
  p value
  p original_params
  v.replace("[FILTERED]") if key.to_s.match(/^(city|state)$/i)?
end

推荐阅读