class Hatchet::StructuredFormatter

Public: Structured formatter class. Outputs messages as JSON strings.

Public Class Methods

new() click to toggle source

Public: Creates a new instance.

# File lib/hatchet/structured_formatter.rb, line 13
def initialize
  @backtrace = true
  @secs = 0
  @millis = -1
  @level_cache = {}
end

Public Instance Methods

format(level, context, message) click to toggle source

Public: Returns the formatted message.

level - The severity of the log message. context - The context of the log message. message - The message provided by the log caller.

Returns messages in the format:

%Y-%m-%d %H:%M:%S.%L [THREAD] LEVEL CONTEXT - MESSAGE
    BACKTRACE

The backtrace is only present if the message contains an error.

# File lib/hatchet/structured_formatter.rb, line 33
def format(level, context, message)
  msg = message.evaluated_message

  case msg
  when Hash
    # Assume caller is following conventions
    log = msg.dup
  else
    # Otherwise treat as String
    log = { :message => msg.to_s.strip }
  end

  log[:timestamp] = timestamp
  log[:level] = format_level(level)
  log[:pid] = Process.pid

  unless Thread.current == Thread.main
    log[:thread] = Thread.current.object_id
  end

  log[:context] = context

  if message.ndc.any?
    log[:ndc] = message.ndc.to_a
  end

  if message.error
    error = message.error

    log[:error_class] = error.class.to_s
    log[:error_message] = error.message
    log[:error_backtrace]

    if error.respond_to?(:backtrace)
      backtrace = error.backtrace
      backtrace = backtrace.take(backtrace_limit) if backtrace_limit
      log[:error_backtrace] = backtrace.join("\n")
    end
  end

  JSON.generate(log.to_h)
end

Private Instance Methods

format_level(level) click to toggle source

Private: Returns the level formatted for log output as a String.

# File lib/hatchet/structured_formatter.rb, line 99
def format_level(level)
  @level_cache[level] ||= level.to_s.upcase
end
timestamp() click to toggle source

Private: Returns the current time as a String.

# File lib/hatchet/structured_formatter.rb, line 80
def timestamp
  time = Time.now.getutc

  secs = time.to_i
  millis = time.nsec/1000000

  return @last if @millis == millis && @secs == secs

  unless secs == @secs
    @secs = secs
    @date = time.strftime('%Y-%m-%d %H:%M:%S.')
  end

  @millis = millis
  @last = @date + "00#{millis}"[-3..-1]
end