【问题标题】:Log every SQL query to database in Rails将每个 SQL 查询记录到 Rails 中的数据库
【发布时间】:2010-12-10 09:41:38
【问题描述】:

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

我会将这样的东西放在 rails 代码的什么地方?

【问题讨论】:

    标签: sql ruby-on-rails ruby logging


    【解决方案1】:

    这里是 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
    

    【讨论】:

    • misuse.org 上的帖子指出它应该由application.rb 加载,在那里您可能需要一个包含您的覆盖代码的文件。 (在 Rails 2 上,你被环境配置文件困住了。)
    【解决方案2】:

    @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
    

    【讨论】:

      【解决方案3】:

      作为关注者的说明,您可以“记录所有查询”,如 Rails - See generated SQL queries in Log files,然后根据需要对文件进行 grep 查找。

      【讨论】:

        【解决方案4】:

        如果您使用的是 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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 记住不要自己拦截日志查询,否则你会得到一个无限循环......
          • @DanSingerman 假设您要在 SQL 本身中记录查询。
          【解决方案6】:

          SQL 服务器?如果是这样……

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

          【讨论】:

            猜你喜欢
            • 2011-05-19
            • 1970-01-01
            • 2015-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-21
            相关资源
            最近更新 更多