我正在try 启用verbose query logging in Rails,但ActiveRecord::LogSubscriber
的行为异常,这导致详细的查询日志(log)记录不起作用.
这个问题似乎起源于这里:https://github.com/rails/rails/blob/v6.0.0/activerecord/lib/active_record/log_subscriber.rb#L113
如果Iinspect
是locations
变量,我可以看到它does包含以下内容:
[
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.0/lib/active_record/log_subscriber.rb:100:in `debug'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.0/lib/active_record/log_subscriber.rb:45:in `sql'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/subscriber.rb:145:in `finish'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/log_subscriber.rb:107:in `finish'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/fanout.rb:160:in `finish'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/fanout.rb:62:in `block in finish'",
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/notifications/fanout.rb:62:in `each'",
...
]
但是,一旦它通过了clean
方法,它就是一个空array.所以这就是:
backtrace_cleaner.clean(locations.lazy).first
返回nil
.因此,line if source
上的source
赋值是nil
,这意味着line 107上的if source
的赋值结果为FALSE,并且不记录任何内容.
更新
我将这两个puts
加到ActiveRecord::LogSubscriber
中:
def log_query_source
source = extract_query_source_location(caller)
puts "-----\n-\n-\nCALLERS: #{caller.inspect}\n-\n-\n-----"
if source
logger.debug(" ↳ #{source}")
end
end
def extract_query_source_location(locations)
puts "-----\n-\n-\nCLEANER: #{backtrace_cleaner.instance_values}\n-\n-\n-----"
backtrace_cleaner.clean(locations.lazy).first
end
以帮助收集有关实际注册为调用方的内容以及回溯清除程序为过滤和静默建立了哪些内容的一些上下文.
以下是调用者的输出(我只是包含了足够的内容来显示我们的应用程序中列出了源):
[
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.0/lib/active_record/log_subscriber.rb:100:in `debug'",
...
"/Users/jeff/Development/lead-simple/LeadSimple/components/api/app/graph/api/loaders/association_loader.rb:47:in `preload_association'",
"/Users/jeff/Development/lead-simple/LeadSimple/components/api/app/graph/api/loaders/association_loader.rb:34:in `perform'",
...
"/Users/jeff/Development/lead-simple/LeadSimple/components/api/app/controllers/api/graphql_controller.rb:16:in `execute'",
...
"/Users/jeff/Development/lead-simple/LeadSimple/components/api/lib/api/graphql_reloader.rb:18:in `call'",
...
"/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/puma-5.6.5/lib/puma/thread_pool.rb:147:in `block in spawn_thread'"
]
下面是回溯清除程序的输出:
{
"silencers"=>[
#<Proc:0x0000000108343330@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/backtrace_cleaner.rb:101>,
#<Proc:0x00000001083432e0@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/backtrace_cleaner.rb:105>,
#<Proc:0x00000001083431c8@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/railties-6.0.0/lib/rails/backtrace_cleaner.rb:19>
],
"filters"=>[
#<Proc:0x0000000108343380@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/backtrace_cleaner.rb:97>,
#<Proc:0x0000000108343240@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/railties-6.0.0/lib/rails/backtrace_cleaner.rb:16>,
#<Proc:0x0000000108343218@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/railties-6.0.0/lib/rails/backtrace_cleaner.rb:17>,
#<Proc:0x00000001083431f0@/Users/jeff/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/railties-6.0.0/lib/rails/backtrace_cleaner.rb:18>
],
"root"=>"/Users/jeff/Development/lead-simple/LeadSimple/"
}
正如您所看到的,我们的应用程序代码没有任何特定的东西被静默(甚至过滤).但是,还有"root"
实例值,这非常奇怪,因为如果您查看ActiveRecord::BacktraceCleaner
的source code,则只定义了@filters
和@silencers
两个实例变量.
我猜这里涉及到这一点,因为将值设置为"root"
的路径将删除我们的应用程序级跟踪(如果用作消音器).问题是,我不知道这是从哪里来的.
我能猜到的唯一一件事是,我们的一个gem重载了ActiveSupport::BacktraceCleaner
以添加@root
实例变量,并在此基础上增加了一些静默层.‘_(ツ)_/’