我想将调用logger方法的方法的名称插入到我的日志文件中。不是整个堆栈跟踪,但类,方法和/或行号会很棒。
在任何方法中,都可以使用caller
来获取字符串数组,每个字符串都包含文件,行号和方法名称。我想出了一个非常可怕的kludge使用正则表达式和Enumerable#find
来尝试返回第一个非记录器堆栈帧。我想它可行,但是如果日志Ruby文件的位置在不同的版本或Rails中发生变化,或者我将我的文件命名为与日志有关,它将会中断。如果我从堆栈顶部获取一个给定的索引(我先做了这个,然后重构了一件事,自然它给了我错误的框架)。
请注意,我不打算只记录控制器或操作,因为可以轻松检索它们。主要是针对lib/
目录中的内容。
有没有一种简单的方法可以做到这一点?每次我做一个日志声明时,我都不想传递__method__
。
答案 0 :(得分:2)
我已经查看了不同的解决方案,用于捕获我在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
包含整个回溯的可枚举数组。如果你完整地看一下它,你会发现大多数调用都是在项目之外的某个宝石内部。我发现通过遍历Kernel.caller
直到找到包含我的Rails.root
的第一个地方,我可以获得包含我要解析的信息的行。
实施例:
如果我从Streamer类的start方法调用Rails.logger.debug("Streamer class started!")
,原始条目将如下所示:
/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!
我希望这有助于让你的车轮转动。
答案 1 :(得分:0)
如何设置log_tags来调用__method__
?
Blog::Application.configure do
config.log_tags = [lambda { |req| __method__ }]
end