loading...

Logging Rails requests with structure and colors

rhymes profile image rhymes ・1 min read

In a related post about Flask and Python I explained how to structure request logs in Python with a sprinkle of colors.

Rails already has the great lograge but how can we leverage it and add ANSI colors to the strings?

Fortunately lograge supports custom formatters with:

Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.formatter = YourOwnFormatter.new
end

so I just created a new formatter to add colors like this:

require 'colorized_string'

class ColorKeyValue < Lograge::Formatters::KeyValue
  FIELDS_COLORS = {
    method: :red,
    path: :red,
    format: :red,
    controller: :green,
    action: :green,
    status: :yellow,
    duration: :magenta,
    view: :magenta,
    db: :magenta,
    time: :cyan,
    ip: :red,
    host: :red,
    params: :green
  }

  def format(key, value)
    line = super(key, value)

    color = FIELDS_COLORS[key] || :default
    ColorizedString.new(line).public_send(color)
  end
end

I admit that color coding each parameter might be a little too much but I'm having fun :-D

require 'colorized_string' and ColorizedString are part of the colorize library.

This is the result:

colorized logging

Posted on Mar 16 '18 by:

rhymes profile

rhymes

@rhymes

Software developer @ DEV

Discussion

markdown guide
 

can you describe more about where to put ColorKeyValue class ? I would be very appreicated
I'm trying to make YourOwnFormatter.new work but failed.

I created a file called color_key_value.rb and put those code inside
...
require 'colorized_string'
class ColorKeyValue < Lograge::Formatters::KeyValue
...
and
config.lograge.formatter = ColorKeyValue.new in development.rb

but it shows uninitialized constant ColorKeyValue (NameError)

 

You should put everything in a lograge initializer.

# config/initializers/lograge.rb
require 'colorized_string'

class ColorKeyValue < Lograge::Formatters::KeyValue
  # ...
end

Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.formatter = ColorKeyValue.new
end
 

thank you ! but I think got the error at this line : color = FIELDS_COLORS[key] || :default

Could not log "process_action.action_controller" event. NoMethodError: undefined method `default' for "user_type=NONE":ColorizedString ["/Users/alvin/Documents/flw/config/initializers/lograge.rb:24

Can you share the whole file? You can use stuff gist.github.com/ or pastebin.com/

 

That's really cool and I love how simple it is. Thanks for sharing!

 

Awesome! Love how simple this is.