Записывать каждый SQL-запрос в базу данных в Rails - PullRequest
13 голосов
/ 27 октября 2009

Я хочу сохранить в лог-файл некоторые рельсы SQL-запросов, а именно, CREATE, UPDATE и DELETE. поэтому мне нужно перехватить все запросы, а затем отфильтровать их, возможно, с помощью некоторого регулярного выражения и зарегистрировать их при необходимости.

Куда бы я поместил такую ​​вещь в коде рельсов?

Ответы [ 6 ]

15 голосов
/ 29 октября 2009

Вот упрощенная версия того, с чем связан 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
7 голосов
/ 27 октября 2009

SQL-логирование в рельсах - Вкратце - вам нужно переопределить метод выполнения ActiveRecord. Там вы можете добавить любую логику для регистрации.

2 голосов
/ 05 июня 2012

В качестве заметки для подписчиков, вы можете «регистрировать все запросы», например Rails - смотрите сгенерированные запросы SQL в файлах журналов , а затем, при желании, подбирайте файлы для тех, которые вам нужны.

1 голос
/ 29 октября 2009

Если вы используете 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

0 голосов
/ 14 ноября 2018

Немного обновленная версия ответа @ 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
0 голосов
/ 27 октября 2009

SQL Server? Если так ...

На самом деле, я бы сделал это в конце SQL. Вы можете настроить трассировку и собирать каждый запрос, который приходит через соединение с определенным именем приложения. Если вы сохраните его в таблице, вы можете легко запросить эту таблицу позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...