我使用Rails过滤器参数来不打印日志中的城市和州。
Rails.application.config.filter_parameters += [:city, :state]
然而,我有一个自定义日志被错误地过滤了,我需要打印它:
Rails.logger.info("Transaction state has changed.", state: transaction.state)
如何强制此哈希绕过参数筛选?
我不认为有什么方法可以忽略特定的过滤器,但是可以降低过滤器的通用性。它们比看上去更通用。
Rails.application.config.filter_parameters
中的每个条目实际上都是ActiveSupport::ParameterFilter.new
的一个参数。
这需要两种类型的筛选器:Regexes和Proc。其他所有内容都转换为Regex。
Rails.application.config.filter_parameters += [:city, :state]
实际上是非常通用的Rails.application.config.filter_parameters += [/city/i, /state/i]
。这将匹配state_of_mind
和specificity
,这可能不是您所想的。
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
(。
但是,这些仍然是未固定的regex匹配,因此将匹配{ 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