如何告诉Rails在特定日志中绕过参数过滤器日志记录



我使用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_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(。

但是,这些仍然是未固定的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

最新更新