将进程信息添加到Rails记录器

时间:2012-04-13 19:46:50

标签: ruby-on-rails-3 logging

我目前有一个Rails应用程序,它有多个进程:由Redis触发的Web服务进程和后台工作程序。

问题有时很难检查日志文件并确定给定行为发生的位置 - 是在Web部分还是在Resque工作者身上?

是否有办法包含进程名称甚至进程ID或允许我按进程区分每个日志条目的内容?

2 个答案:

答案 0 :(得分:3)

看起来有一些选择:

这是一篇相关的SO文章:   - Rails 3.2.2 log files unordered, requests intertwined

我最好的选择似乎是使用:uuid代替。它传达相同的信息,以便在您将多个进程记录到同一文件时区分请求。

答案 1 :(得分:2)

如果您需要在控制器上下文之外的进程ID(例如延迟作业),您可以将其放在初始化程序中:

class ActiveSupport::BufferedLogger
  def formatter=(formatter)
    @log.formatter = formatter
  end
end

class Formatter
  SEVERITY_TO_COLOR_MAP   = {'DEBUG'=>'0;37', 'INFO'=>'32', 'WARN'=>'33', 'ERROR'=>'31', 'FATAL'=>'31', 'UNKNOWN'=>'37'}

  def call(severity, time, progname, msg)
    formatted_severity = sprintf("%-5s","#{severity}")

    formatted_time = time.strftime("%Y-%m-%d %H:%M:%S.") << time.usec.to_s[0..6].ljust(6)
    color = SEVERITY_TO_COLOR_MAP[severity]

    "\033[0;37m#{formatted_time} (pid:#{$$})\033[0m [\033[#{color}m#{formatted_severity}\033[0m] #{msg.strip}\n"
  end

end

Rails.logger.formatter = Formatter.new

更多信息:http://www.software-thoughts.com/2013/08/adding-process-id-and-timestamps-to.html

此处的原帖:http://cbpowell.wordpress.com/2012/04/05/beautiful-logging-for-ruby-on-rails-3-2/