如何从Rails 5日志的SQL部分中过滤敏感参数?

时间:2016-12-09 06:40:33

标签: ruby-on-rails ruby-on-rails-5

Rails 5提供参数过滤,我在config.filter_parameters += ["my_token"]中指定了application.rb

在开发(环境)模式下测试我的应用程序,我看到my_token已从日志文件的请求行中正确过滤:

Started GET "/something?my_token=[FILTERED]"

然而,紧接着的SQL日志行仍然以纯文本形式包含参数的值(" SELECT stuff FROM things,"等,my_token作为参数)

Rails 5是否提供了一种从日志文件的SQL部分过滤此原始值的方法?

我还在生产模式下运行我的应用程序,虽然日志文件更简洁,但它们仍会在生成的SQL语句的D类型日志行中显示未过滤的值。

我没有指定自定义日志设置 - 默认情况下,我的过滤器参数设置以外的所有内容都是。

我自己的搜索显示没有相关的讨论。也许我错过了什么?

THX!

1 个答案:

答案 0 :(得分:6)

如果要完全禁用SQL日志进行生产,可以将config/environments/production.rb中的日志级别更改为:info

  config.log_level = :info

如果您只想对包含敏感数据的少数查询进​​行日志记录,则可以使用Rails.logger.silence。它会在提供的块的持续时间内使日志静音。因此,它可以用于避免将特定的SQL查询写入日志。

用法:

def index
  Rails.logger.silence do
    # load method is used to force query execution inside the block
    @items = Item.all.load 
  end
end

请记住,查询是懒惰地执行的,因此如果查询在块之外执行,则无论如何都会记录它。以下示例将失败:

def index
  Rails.logger.silence do
    # The query will be executed outside the block when @items is first used in the view
    @items = Item.all
  end
end