我想保存一些SQL查询rails执行的日志文件,(即CREATE,UPDATE和DELETE) 因此,我需要拦截所有查询,然后使用一些正则表达式过滤它们并根据需要记录它们。
我会把这样的东西放在rails代码中?
答案 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。它将跟踪可能更新数据的所有内容。您可以轻松地从该日志中删除所需内容。
答案 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