加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何禁用特定列的ActiveRecord日志记录?

发布时间:2020-12-16 21:55:14 所属栏目:百科 来源:网络整理
导读:我遇到一个问题,在我看来,这对大多数的rails用户来说都是一个问题,但是我找不到任何解决方案. 例如,当执行文件上传可能较大的二进制文件并将其存储在数据库中时,您绝对不希望rails或ActiveRecord在开发模式(日志文件stdout)中记录该特定字段.如果文件相当大,
我遇到一个问题,在我看来,这对大多数的rails用户来说都是一个问题,但是我找不到任何解决方案.

例如,当执行文件上传可能较大的二进制文件并将其存储在数据库中时,您绝对不希望rails或ActiveRecord在开发模式(日志文件stdout)中记录该特定字段.如果文件相当大,这将导致查询执行中断,几乎可以杀死我的终端.

是否有任何可靠和非恶意的方法来禁用特定字段的日志记录?记住,我不是在说要求参数禁用日志记录 – 这已经很好地解决了.

感谢任何有关的信息!

解决方法

如果这有助于任何人,这里是上述代码段的Rails 4.1兼容版本,还包括修改非二进制绑定参数(例如文本或json列),并在编辑之前将日志记录增加到100个字符.感谢大家的帮助!
class ActiveRecord::ConnectionAdapters::AbstractAdapter
  protected

  def log_with_binary_truncate(sql,name="SQL",binds=[],statement_name = nil,&block)
    binds = binds.map do |col,data|
      if data.is_a?(String) && data.size > 100
        data = "#{data[0,10]} [REDACTED #{data.size - 20} bytes] #{data[-10,10]}"
      end
      [col,data]
    end

    sql = sql.gsub(/(?<='x[0-9a-f]{100})[0-9a-f]{100,}?(?=[0-9a-f]{100}')/) do |match|
      "[REDACTED #{match.size} chars]"
    end

    log_without_binary_truncate(sql,name,binds,statement_name,&block)
  end

  alias_method_chain :log,:binary_truncate
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读