2011-05-19 81 views
1

有没有人有经验如何使Rails(2.3.x)登录请求级别?就像处理单个请求时抛出的所有日志以某种方式分组在一起。现在每个日志事件都会附加到日志/ *。日志文件中。我希望它们按请求分开,以便我可以看到(并解析)请求开始的位置,请求期间发生了什么以及结束的位置。Rails 2.3.x每个请求日志记录

任何体验或想法?我真的不知道从哪里开始。

谢谢! 伦纳特

+0

你或许可以添加一些类型的会话数据,以@下面康斯坦丁的建议,可以稍后组他们每会话。 (它们已经是每个请求了,唯一的web服务器就是请求,每次调用在你加载资源的时候是一个不同的请求。) – 2011-05-19 21:15:40

回答

0

在我的应用我更换默认记录器: - 在一行上记录每个消息(删除所有新行) - 添加进程ID,方法名等,以日志行除了标准的东西

我对开源计划这个记录,但暂时在这里它是在情况下,它证明是有用的:

# lives in #{RAILS_ROOT}/lib/annotated.rb 

# don't forget to require in config/application.rb: 
# require File.join(File.dirname(__FILE__), '../lib/log/annotated') 


class AnnotatedLogger < Logger 
    def initialize *args 
    super *args 

    [:info, :debug, :warn, :error, :fatal].each {|m| 
     AnnotatedLogger.class_eval %Q! 
     def #{m} arg=nil, &block 
     pid = "%.5d:" % $$ 
     if block_given? 
      arg = yield 
     end 
      out = arg.gsub(/\n/, ''); 
     file, line, method = caller_method 
     t = Time.now 
     super "[%s.%03d] %s %6.6s |%-40.40s | %s" % [t.strftime("%Y-%m-%d %H:%M:%S"), t.usec/1000, pid, "#{m.upcase}", 
         "\#{File.basename(file)}:\#{line}:\#{method}", out] 
     end 
     ! 
    } 

    def caller_method 
     parse_caller(caller(3).first) 
    end 

    def parse_caller(at) 
     if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at 
      file = Regexp.last_match[1] 
      line = Regexp.last_match[2].to_i 
      method = Regexp.last_match[3] 
      [file, line, method ] 
     end 
    end 
    end 
end 
+0

Jut要清楚...每个日志有一行意味着你可以轻松地grep for一个PROCESS ID记录,从而隔离请求中发生的所有事情(如果您使用的是单线程应用服务器,例如独角兽,杂种等) – 2011-05-19 20:03:51