我已经查看了不同的解决方案来捕获我从我的 rails 应用程序中调用任何给定记录器实例方法的确切位置(文件、行号、方法名称)。为此,您需要覆盖 Logger 的 format_message 方法,而这样做的好地方是在您的 rails 项目config/environment.rb
文件中。
这就是我想出的,这对我来说已经足够了;o)
class Logger
def format_message(severity, timestamp, progname, msg)
line = ''
Kernel.caller.each{|entry|
if (entry.include? Rails.root.to_s)
line = " #{entry.gsub(Rails.root.to_s,'').gsub(/\/(.+)\:in `(.+)'/, "\\1 -> \\2")}"
break
end
}
"[#{timestamp.strftime("%Y%m%d.%H:%M:%S")}] #{severity}#{line}: #{msg}\n"
end
end
Kernel.caller
包含整个回溯的可枚举数组。如果您完整地查看它,您会发现大多数调用都位于项目之外某个地方的 gem 内部。我发现通过循环Kernel.caller
直到找到包含 my 的第一个位置Rails.root
,我可以获得包含我想要解析的信息的行。
示例:如果我Rails.logger.debug("Streamer class started!")
从 Streamer 类的 start 方法调用,原始条目将如下所示:
/Users/chikoon/www/my_rails_app/lib/streamer.rb:7:in `start'
所以当它通过我的格式化程序时,我已经得到了时间戳、严重性模式、文件路径、行号、方法名称和消息:
[20140919.19:23:44] DEBUG lib/streamer.rb:7 -> start: Streamer class started!
我希望这有助于让你的车轮转动。