首页 > 解决方案 > 是否可以绕过 Rails 活动记录日志中的 sql_color?

问题描述

我有一个问题,IPv6 地址的二进制表示会导致活动记录日志中的 sql_color 生成很长的错误消息。

该查询确实有效并且确实返回了预期的结果。

我认为这是因为二进制 IPv6 看起来像:

"\xFE\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f"

sql_color 方法将其解释为控制代码。

如果我设置:

Rails.applicaiton.config.colorize_logging = false

即使不再显示任何颜色,它仍然会这样做。

理想情况下,我想知道绕过 sql_color 的最佳方法。

现在我刚刚覆盖了该方法并将其放入开始/救援块中。

如何重现:

   rails new binary_bug -d mysql
   cd binary_bug
   rails db:create
   rails g model Bug name:text first_ip:binary second_ip:binary

将迁移更新为

 class CreateBugs < ActiveRecord::Migration[5.2]
  def change
    create_table :bugs do |t|
      t.text :name
      t.binary :first_ip, limit: 16
      t.binary :second_ip, limit: 16

      t.timestamps
    end
  end
end
rails db:migrate
Bug.create(name: 'test1', first_ip: IPAddr.new('fe80::c').hton, second_ip: IPAddr.new('fe80::c').hton.to_s )
Bug.create(name: 'test2', first_ip: IPAddr.new('2001:db8:1234::').hton, second_ip: IPAddr.new('2001:db8:1234:ffff:ffff:ffff:ffff:ffff').hton.to_s )
# Try to search the DB.
bugs = Bug.where("first_ip > ?", IPAddr.new('2001:db8:1234::12').hton)

这将给出一个很长的错误,开头为:

无法记录“sql.active_record”事件。ArgumentError:UTF-8 中的无效字节序列

它指向的第一个文件是:

gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:71:in `sql_color'"

这是一个私有方法,如下所示:

  def sql_color(sql)
    case sql
    when /\A\s*rollback/mi
      RED
    when /select .*for update/mi, /\A\s*lock/mi
      WHITE
    when /\A\s*select/i
      BLUE
    when /\A\s*insert/i
      GREEN
    when /\A\s*update/i
      YELLOW
    when /\A\s*delete/i
      RED
    when /transaction\s*\Z/i
      CYAN
    else
      MAGENTA
    end
  end

如果我只用 MAGENTA 替换它或将其包装在开始/救援块中并重新启动 spring,它将正常工作。

标签: mysqlruby-on-rails

解决方案


推荐阅读