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

Sex*_*hor 15 ruby-on-rails ruby-on-rails-5

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

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

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

但是,紧跟在后面的SQL日志行仍然以纯文本形式包含参数的值("SELECT stuff FROM things"等,my_token作为参数).

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

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

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

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

谢谢!

tor*_*rce 7

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

  config.log_level = :info
Run Code Online (Sandbox Code Playgroud)

如果您只想使用敏感数据进行少量查询的静态记录,则可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)