将每个SQL查询记录到Rails中的数据库

时间:2009-10-27 08:04:50

标签: sql ruby-on-rails ruby logging

我想保存一些SQL查询rails执行的日志文件,(即CREATE,UPDATE和DELETE) 因此,我需要拦截所有查询,然后使用一些正则表达式过滤它们并根据需要记录它们。

我会把这样的东西放在rails代码中?

6 个答案:

答案 0 :(得分:15)

这里是c0r0ner链接到的简化版本,以便更好地显示它:

connection = ActiveRecord::Base.connection
class << connection
  alias :original_exec :execute
  def execute(sql, *name)
    # try to log sql command but ignore any errors that occur in this block
    # we log before executing, in case the execution raises an error
    begin
        File.open(Rails.root.join("/log/sql.txt"),'a'){|f| f.puts Time.now.to_s+": "+sql}
    rescue Exception => e
      ;
    end
    # execute original statement
    original_exec(sql, *name)
  end
end

答案 1 :(得分:7)

SQL logging in rails - 简而言之 - 您需要覆盖ActiveRecord执行方法。在那里,您可以添加任何记录逻辑。

答案 2 :(得分:2)

作为粉丝的注释,您可以记录所有查询&#34;比如Rails - See generated SQL queries in Log files,然后根据需要grep你想要的文件。

答案 3 :(得分:1)

如果您使用的是mysql,我会查看mysqlbinlog。它将跟踪可能更新数据的所有内容。您可以轻松地从该日志中删除所需内容。

http://dev.mysql.com/doc/refman/5.0/en/mysqlbinlog.html

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

答案 4 :(得分:0)

SQL Server?如果是的话......

实际上,我会在SQL端执行此操作。您可以设置跟踪,并收集通过与特定应用程序名称的连接提供的每个查询。如果将其保存到表中,以后可以轻松查询该表。

答案 5 :(得分:0)

@luca的答案的至少是Rails 4(可能是Rails 5)的稍有更新的版本

将其放置在config/initializers/sql_logger.rb中:

connection = ActiveRecord::Base.connection
class << connection
  alias :original_exec :execute
  def execute(sql, *name)
    # try to log sql command but ignore any errors that occur in this block
    # we log before executing, in case the execution raises an error
    begin
      File.open(Rails.root.join("log/sql.log"), 'a') do |file|
        file.puts Time.now.to_s + ": " + sql
      end
    rescue Exception => e
      "Error logging SQL: #{e}"
    end
    # execute original statement
    original_exec(sql, *name)
  end
end