У меня возникла проблема с поиском корней некоторых SQL-запросов в моем проекте.
Чтобы устранить ее, я хотел регистрировать стек вызывающих приложений вместе с каждым запущенным запросом.
Я не гуглил нестандартное решение, поэтому решил самостоятельно создать надежное и повторно используемое решение.
Проследив за стеком, я нашел место, где все запросы прошли Mysql2Adapter.execute
метод (я имею в виду, конечно, mysql)
Я переопределил этот метод в каталогах инициализаторов rails, обезьяна-патч со стеком вызывающего абонента приведена ниже:
module ActiveRecord
module ConnectionAdapters
class Mysql2Adapter < AbstractAdapter
def execute(sql, name = nil)
@connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
if name == :skip_logging
@connection.query(sql)
else
# caller logging
log_stack
# EO
log(sql, name) { @connection.query(sql) }
end
rescue ActiveRecord::StatementInvalid => exception
if exception.message.split(":").first =~ /Packets out of order/
raise ActiveRecord::StatementInvalid, "'Packets out of order'... bindings."
else
raise
end
end
private
def log_stack
#If marazmuz will take over i would not like to spam logs in production
return unless Rails.env == 'development'
#Regex with rails directory path would be helpful in taking app stack trace only
regexp = Regexp.new( Rails.root.to_s )
res = ''
caller.each_with_index{|x,i|
#We'll took only items containing Rails.root and we are not interested in current stack position, so skip i == 0
res << "#{ '#'+i.to_s}:\t#{ x.sub(regexp,'') }\n" if x =~ regexp && i != 0
}
Rails.logger.info( res ) unless res.blank?
end
end
end
end
наконец, следующий вывод записывается в журнал
\#4: /app/models/contact.rb:57:in `get_raw_cols'
\#5: /app/models/contact.rb:65:in `stat_cols'
\#6: /app/components/contacts_tab.rb:85:in `configuration'
\#19: /app/views/welcome/index.html.erb:1:in `_app_views_welcome_index_html_erb___736761216545810182_25680180__4434876849107960087'
SQL (0.1ms) SELECT `contacts`.`activity` FROM `contacts`
Кто-нибудь:
Любые комментарии / улучшения к приведенному выше коду также приветствуются.
Заранее спасибо.