You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airbrake报错:自定义Proc致KeysBlacklist模式无效,参数过滤失效

问题原因与解决方案

核心原因

  1. Airbrake的blacklist_keys不支持Proc类型:
    Rails的filter_parameters允许通过自定义Proc实现差异化过滤逻辑,但Airbrake的KeysBlacklist过滤器仅接受符号、字符串、正则表达式这类能直接匹配参数键的模式,无法识别和执行Proc。当你把包含Proc的Rails过滤配置直接赋值给c.blacklist_keys时,Proc会被判定为无效模式,因此抛出one of the patterns in Airbrake::Filters::KeysBlacklist is invalid的错误,日志里的nil就是无效Proc被识别后的结果。
  2. 仅密码生效的原因:
    密码对应的是:password符号,属于Airbrake支持的有效模式,所以能被正常过滤;而邮箱、姓名对应的自定义Proc不被支持,因此无法生效,参数会原样上报。

解决方案

不能直接复用Rails的过滤配置给Airbrake,需要分开处理:

1. 配置完全过滤的参数(如密码)

直接使用Airbrake的blacklist_keys处理不需要差异化的参数:

# config/initializers/airbrake.rb
Airbrake.configure do |c|
  # 仅配置完全过滤的键
  c.blacklist_keys = [:password]
  # 其他Airbrake配置...
end

2. 自定义过滤器实现差异化过滤(邮箱、姓名)

针对需要保留部分内容的参数,编写Airbrake自定义过滤器来实现逻辑:

# config/initializers/airbrake.rb
Airbrake.add_filter do |notice|
  # 处理邮箱:保留前2位字符和域名,中间替换为***
  if notice[:params]&.[](:email)
    notice[:params][:email] = notice[:params][:email].gsub(/(?<=.{2}).*(?=@)/, '***')
  end

  # 处理姓名:保留第一个字符,后面替换为***
  if notice[:params]&.[](:name)
    notice[:params][:name] = notice[:params][:name].gsub(/(?<=^.).*/, '***')
  end
end

3. 保留Rails原有的参数过滤配置

继续使用Rails的filter_parameters处理日志中的参数过滤,两者互不干扰:

# config/application.rb
Rails.application.configure do
  config.filter_parameters += [:password, ->(k, v) { v.gsub(/(?<=.{2}).*(?=@)/, '***') if k == 'email' }, ->(k, v) { v.gsub(/(?<=^.).*/, '***') if k == 'name' }]
  # 其他Rails配置...
end

内容的提问来源于stack exchange,提问作者Cameron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:27:41