headshot of Chris Tonkinson
Chris Tonkinson

tech {enthusiast, practitioner, leader, podcaster, mentor, entrepreneur}


Refactored Podcast

I co-host Refactored, a casual, ongoing conversation between two technology leaders trying to suck a little less every day.

Career Schema Project

I founded the Career Schema Project with the mission of developing open standards and technology to reduce the hassle of online jobseeking.

RSS Subscribe

© 2021 Chris Tonkinson

[SOLVED] What do the colors mean in the rails console?

Rails console output

TL;DR — Nothing.

Ever notice that database log entry prefixes are colored in the rails console? Ever wonder just what the cyan and magenta represent? There didn’t seem to be an identifiable pattern, so I went fishing in the rails source.

It was a deep rabbit hole (because RoR is such a sprawling beast of indirection), but eventually I wound up staring at ActiveRecord::LogSubscriber#sql which is defined in log_subscriber.rb around line 33:

def sql(event)
  return unless logger.debug?

  self.class.runtime += event.duration

  payload = event.payload

  return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])

  name  = "#{payload[:name]} (#{event.duration.round(1)}ms)"
  sql   = payload[:sql]
  binds = nil

  unless (payload[:binds] || []).empty?
    binds = "  " + payload[:binds].map { |attr| render_bind(attr) }.inspect

  if odd?
    name = color(name, CYAN, true)
    sql  = color(sql, nil, true)
    name = color(name, MAGENTA, true)

  debug "  #{name}  #{sql}#{binds}"

So the logger chooses between the two colors based on whether or not the statement is odd? Did that mean what I thought it meant? Yep. Sure did. The definition of odd? was right below that:

def odd?
  @odd = !@odd

It’s that simple - the logger simply toggles every other SQL statement between the two colors. The pattern was so simple I’d looked right past it. D’oh!

PS: The history and workings of video terminal colors is a huge topic in and of itself, but if you’re curious, Rails uses standard ANSI escape codes and these are layed out in log_subscriber.rb around [line 39]:

# Embed in a String to clear all previous ANSI sequences.
CLEAR   = "\e[0m"
BOLD    = "\e[1m"

# Colors
BLACK   = "\e[30m"
RED     = "\e[31m"
GREEN   = "\e[32m"
YELLOW  = "\e[33m"
BLUE    = "\e[34m"
MAGENTA = "\e[35m"
CYAN    = "\e[36m"
WHITE   = "\e[37m"

UPDATE: See also [More granular console SQL coloration]({% post_url 2015-08-03-more-granular-console-sql-coloration %})