views:

2349

answers:

2

How can I configure the rails logger to output its log strings in another format? I would like to get something that is more informative like:

[Log Level] [Time] [Message]

Debug : 01-20-2008 13:11:03.00 : Method Called

This would really help me when I want to tail my development.log for messages that only come from a certain log level, like debug.

+1  A: 

Check out Geoffrey Grosenbach's Hodel3000CompliantLogger. It might be exactly what you're looking for, but if not, it should be trivial to edit the functions to get the output you need.

Basically what's involved is creating a new log class by subclassing Logger and overriding the format_message function, and setting your logger to use your new logger class and you should be good to go.

PJ Davis
+7  A: 

Did some digging and found this post in the RubyOnRails Talk google group.

So I modified it a little bit and put it at the end of my environment.rb:

module ActiveSupport
  class BufferedLogger
    def add(severity, message = nil, progname = nil, &block)
      return if @level > severity
      message = (message || (block && block.call) || progname).to_s

      level = {
        0 => "DEBUG",
        1 => "INFO",
        2 => "WARN",
        3 => "ERROR",
        4 => "FATAL"
      }[severity] || "U"

      message = "[%s: %s #%d] %s" % [level,
                                     Time.now.strftime("%m%d %H:%M:%S"),
                                     $$,
                                     message]

      message = "#{message}\n" unless message[-1] == ?\n
      buffer << message
      auto_flush
      message
    end
  end
end

This results in a format string like this:

[DEBUG: 0121 10:35:26 #57078] Rendered layouts/_header (0.00089)

Bill