Skip to content
Apr 13 / Derek Reeve

Formatting the Rails logger

I’ve always been somewhat annoyed that Rails 2 doesn’t have a way to specify the log formatting. I would prefer that log messages include the logging level, for example.

Thanks to a post on Stack Overflow, I realized it’s pretty simple to override BufferedLogger.add to do what I want:

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] %-6s%s" % [Time.now.strftime("%Y-%m-%d %H:%M:%S"), level,
                                 message]

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

Adding this to environment.rb will cause the logger to print log messages in the format

[2010-04-13 11:55:20] DEBUG monkeys