DEV Community

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Discussion (9)

pic
Editor guide
Collapse
srichsun profile image
EvanW

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)

Collapse
rhymes profile image
rhymes Author

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
Collapse
alvinwch profile image
AlvinWCH

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

Thread Thread
rhymes profile image
rhymes Author

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

Collapse
philnash profile image
Phil Nash

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

Collapse
andy profile image
Andy Zhao (he/him)

Colorize is great 👍

Collapse
richjdsmith profile image
Rich Smith

Awesome! Love how simple this is.

Collapse
tidelake profile image
Jesse Crockett

Can we add background color to the rails log, using this gem. Thank you so much for this!

Collapse
rhymes profile image
rhymes Author

I think so, the colorize gem used in the example supports them: github.com/fazibear/colorize#usage