【发布时间】:2010-12-10 09:41:38
【问题描述】:
我想保存一些 SQL 查询 rails 执行的日志文件(即 CREATE、UPDATE 和 DELETE) 因此我需要拦截所有查询,然后使用一些正则表达式过滤它们并根据需要记录它们。
我会将这样的东西放在 rails 代码的什么地方?
【问题讨论】:
标签: sql ruby-on-rails ruby logging
我想保存一些 SQL 查询 rails 执行的日志文件(即 CREATE、UPDATE 和 DELETE) 因此我需要拦截所有查询,然后使用一些正则表达式过滤它们并根据需要记录它们。
我会将这样的东西放在 rails 代码的什么地方?
【问题讨论】:
标签: sql ruby-on-rails ruby logging
这里是 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
【讨论】:
application.rb 加载,在那里您可能需要一个包含您的覆盖代码的文件。 (在 Rails 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
【讨论】:
作为关注者的说明,您可以“记录所有查询”,如 Rails - See generated SQL queries in Log files,然后根据需要对文件进行 grep 查找。
【讨论】:
如果您使用的是 mysql,我会查看 mysqlbinlog 。它将跟踪可能更新数据的所有内容。您可以轻松地从该日志中找出您需要的任何内容。
【讨论】:
SQL logging in rails - 简而言之 - 您需要覆盖 ActiveRecord 执行方法。在那里您可以添加任何日志记录逻辑。
【讨论】:
SQL 服务器?如果是这样……
实际上,我会在 SQL 端执行此操作。您可以设置跟踪,并收集通过与特定应用程序名称的连接产生的每个查询。如果将其保存到表中,则以后可以轻松地查询该表。
【讨论】: