Rails记录器格式 - 插入方法名称调用记录器方法

时间:2013-09-13 03:54:42

标签: ruby ruby-on-rails-3

我想将调用logger方法的方法的名称插入到我的日志文件中。不是整个堆栈跟踪,但类,方法和/或行号会很棒。

在任何方法中,都可以使用caller来获取字符串数组,每个字符串都包含文件,行号和方法名称。我想出了一个非常可怕的kludge使用正则表达式和Enumerable#find来尝试返回第一个非记录器堆栈帧。我想它可行,但是如果日志Ruby文件的位置在不同的版本或Rails中发生变化,或者我将我的文件命名为与日志有关,它将会中断。如果我从堆栈顶部获取一个给定的索引(我先做了这个,然后重构了一件事,自然它给了我错误的框架)。

请注意,我不打算只记录控制器或操作,因为可以轻松检索它们。主要是针对lib/目录中的内容。

有没有一种简单的方法可以做到这一点?每次我做一个日志声明时,我都不想传递__method__

2 个答案:

答案 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