我目前有一个Rails应用程序,它有多个进程:由Redis触发的Web服务进程和后台工作程序。
问题有时很难检查日志文件并确定给定行为发生的位置 - 是在Web部分还是在Resque工作者身上?
是否有办法包含进程名称甚至进程ID或允许我按进程区分每个日志条目的内容?
答案 0 :(得分:3)
看起来有一些选择:
config.log_tags = [:subdomain, :uuid, :remote_ip, Proc.new { "PID-%.5d" % $$ }]
(之前的链接显示速度很慢)config.log_tags = [Proc.new { "PID: %.5d" % Process.pid }]
这是一篇相关的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/