我目前有一个 Rails 应用程序,它有多个进程:由 Redis 触发的 Web 服务进程和后台工作进程。
问题是有时很难检查日志文件并确定给定行为发生的位置——是在 Web 部分还是在 Resque 工作人员上?
有没有办法包含进程名称甚至进程 ID 或允许我按进程区分每个日志条目的东西?
我目前有一个 Rails 应用程序,它有多个进程:由 Redis 触发的 Web 服务进程和后台工作进程。
问题是有时很难检查日志文件并确定给定行为发生的位置——是在 Web 部分还是在 Resque 工作人员上?
有没有办法包含进程名称甚至进程 ID 或允许我按进程区分每个日志条目的东西?
看起来有一些选择:
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 日志文件无序,请求交织在一起
对我来说最好的选择似乎是使用 :uuid 。当您有多个进程记录到同一个文件时,它传达相同的信息以让您区分请求。
如果您需要控制器上下文之外的进程 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/