ruby-on-rails - 如何告诉 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。其他所有内容都转换为正则表达式。
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
)。
但是,这些仍然是未锚定的正则表达式匹配,因此它将匹配 { 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
推荐阅读
- web-scraping - casperjs 无法访问甚至 wget 可以访问的某些网站
- rust - 在 Rust 结果的 Iter 上调用 map
- python - 如何使用python在Firestore中查询包含对象数组的文档
- python - 当还有数字类型的列时,Pandas groupby sum 不包括 timedelta 类型的列
- python - 条形图和标签上的值
- c++ - 如果我采用 A = 10^9 和 B=10^9 ,则以下代码给出负输出。为什么?它为我提供了小整数的正确输出
- excel - 改变表格的格式
- git - 由于文件大,无法推送到 Github
- php - 变量作为 mailto 链接中的地址
- dm-script - 如何找到峰值位置(局部最大值)