使用 Rails 3.2 进行日志记录时,如何记录日志语句出现的文件名和行号?

p.m*_*los 2 logging ruby-on-rails ruby-on-rails-3.2

在使用 Rails 3.2 进行日志记录时,我想记录日志条目所在的文件名和行号。

因此,如果在我的在线 ruby​​ 脚本中customer.rb23有一个类似以下的日志:

Rails.logger.debug "Debug message"
Run Code Online (Sandbox Code Playgroud)

我希望日志记录如下内容:

[customer.rb:23] Debug message
Run Code Online (Sandbox Code Playgroud)

那可能吗?

p.m*_*los 6

我终于找到了最好的解决方案,它也会影响我的应用程序正在使用的其他 gem 的日志格式,如下所示:

  1. 打开类Logger::SimpleFormatter并重写该方法call。您可以在初始化文件 ( config/initializers) 中执行此操作。
  2. call更改记录文件和行的方法caller[5]

这是一个对我有用的示例实现:

class Logger::SimpleFormatter
  def call(severity, time, progname, msg)
    call_details = Kernel.caller[5].gsub(/#{Rails.root}/, '')
    call_details.match /(.+):(.+):/
    filename = $1
    line = $2
    length = 40
    filename = "#{filename[-length, filename.length]}" if filename.length >= length
    filename = filename.rjust(length + 2, '.')
    "[#{severity} #{time} #{filename}:#{line}] #{msg}\n"
  end
end
Run Code Online (Sandbox Code Playgroud)

在上面的解决方案中,我还将文件名限制为最后 40 个字符,以避免打印大文件路径。