如何在Rails应用程序中有选择地跟踪方法及其文件访问?

对于Rails应用程序,我想重载或修改Kernel :: load,以便打印出完整的路径,如puts "-> #{File.expand_path(File.dirname(__FILE__))}/#{File.basename(__FILE__)}"为每个加载的Rails应用程序文件。

我该怎么办? 我想进一步能够过滤,所以我猜我会抛出一个正则表达式,只能显示输出(当我不希望它非常详细),表明文件内的文件访问当前的rails app root。

无论如何,我很欣赏一个重载此方法的示例,以及在服务器启动时Rails应用程序中执行此操作的适当位置。

解析度:

好吧,在经历了一些事情并发现set_trace_func我想出了以下内容:

我将set_trace_fun集成到set_trace_fun的头文件中,沿着mtrace gem中实现的内容。 除了我的app目录以及其他一些繁琐的方法之外,我还要做很多调整来过滤掉所有东西,但它似乎到目前为止还在努力。 与修改有效集成的mtrace源如下:

 mtrace_indent = 0 set_trace_func lambda {|event, file, line, id, binding, klass| case event when 'call' puts "\e[90m| " * mtrace_indent + "\e[35m#{klass}\e[90m#\e[36m#{id} \e[90m#{file}:#{line}\e[0m" + "#{' ' * ([10 - mtrace_indent, 1].max)}\e[90mtxmt://open/?url=file://#{ File.expand_path(file) }&line=#{ line }\e[0m" mtrace_indent += 1 when 'return' mtrace_indent -= 1 end mtrace_indent = 0 if mtrace_indent < 0 } 

当然,如果您不在Mac上,可以删除txmt url部分,但这确实非常有用。

试试这个:

 module Kernel alias_method :old_load, :load def load filename, wrap = false puts "-> #{filename}" old_load filename, wrap end end 

你可以将它放入config/initializers ,但对于你想要做的事情可能会有点迟。

显然,Rails init进程以config/environment.rb开头 ,所以如果你把这个代码放在那个文件的顶部,它应该是第一个加载的东西。