Class: SemanticLogger::Formatters::Color

Inherits:
Default
  • Object
show all
Defined in:
lib/semantic_logger/formatters/color.rb

Defined Under Namespace

Classes: ColorMap

Constant Summary

Constants inherited from Base

Base::CONTROL_CHARS, Base::CONTROL_CHAR_ESCAPES, Base::PRECISION

Instance Attribute Summary collapse

Attributes inherited from Base

#escape_control_chars, #log, #log_application, #log_environment, #log_host, #logger, #precision, #time_format

Instance Method Summary collapse

Methods inherited from Default

#file_name_and_line, #message, #process_info, #thread_name

Methods inherited from Base

build_time_format, #pid, #time

Constructor Details

#initialize(ap: {multiline: false}, color_map: ColorMap.new, **args) ⇒ Color

Adds color to the default log formatter

Example:

# Use a colorized output logger.
SemanticLogger.add_appender(io: $stdout, formatter: :color)

Example:

# Use a colorized output logger changing the color for info to yellow.
SemanticLogger.add_appender(io: $stdout, formatter: {color: {color_map: {info: SemanticLogger::AnsiColors::YELLOW}}})

Example:

# Override the Awesome Print options to output hashes over multiple lines:
SemanticLogger.add_appender(io: $stdout, formatter: {color: {ap: {multiline: true}}})

# Calling the appender added above:
SemanticLogger['Test'].info('hi', {a: 1, b: 2})
=> true
=> 2019-02-12 11:47:50.794339 I [35832:70112015269920] Test -- hi -- {
   :a => 1,
   :b => 2
 }

Parameters: ap: [Hash] Any valid Amazing Print option for rendering data. These options can also be changed be creating a ~/.aprc file. See: https://github.com/amazing-print/amazing_print

Note: The option :multiline is set to false if not supplied.
Note: Has no effect if Awesome Print is not installed.

color_map: [Hash | SemanticLogger::Formatters::Color::ColorMap] ColorMaps each of the log levels to a color



77
78
79
80
81
# File 'lib/semantic_logger/formatters/color.rb', line 77

def initialize(ap: {multiline: false}, color_map: ColorMap.new, **args)
  @ai_options = ap
  @color_map  = color_map.is_a?(ColorMap) ? color_map : ColorMap.new(color_map)
  super(**args)
end

Instance Attribute Details

#colorObject

Returns the value of attribute color.



15
16
17
# File 'lib/semantic_logger/formatters/color.rb', line 15

def color
  @color
end

#color_mapObject

Returns the value of attribute color_map.



15
16
17
# File 'lib/semantic_logger/formatters/color.rb', line 15

def color_map
  @color_map
end

Instance Method Details

#call(log, logger) ⇒ Object



132
133
134
135
# File 'lib/semantic_logger/formatters/color.rb', line 132

def call(log, logger)
  self.color = color_map[log.level]
  super
end

#durationObject



104
105
106
# File 'lib/semantic_logger/formatters/color.rb', line 104

def duration
  "(#{color_map.bold}#{log.duration_human}#{color_map.clear})" if log.duration
end

#exceptionObject



126
127
128
129
130
# File 'lib/semantic_logger/formatters/color.rb', line 126

def exception
  return unless log.exception

  "-- Exception: #{color}#{log.exception.class}: #{escape_control_characters(log.exception.message)}#{color_map.clear}\n#{log.backtrace_to_s}"
end

#levelObject



83
84
85
# File 'lib/semantic_logger/formatters/color.rb', line 83

def level
  "#{color}#{super}#{color_map.clear}"
end

#nameObject



108
109
110
# File 'lib/semantic_logger/formatters/color.rb', line 108

def name
  "#{color}#{super}#{color_map.clear}"
end

#named_tagsObject

Named Tags



95
96
97
98
99
100
101
102
# File 'lib/semantic_logger/formatters/color.rb', line 95

def named_tags
  named_tags = log.named_tags
  return if named_tags.nil? || named_tags.empty?

  list = []
  named_tags.each_pair { |name, value| list << "#{color}#{escape_control_characters(name)}: #{escape_control_characters(value)}#{color_map.clear}" }
  "{#{list.join(', ')}}"
end

#payloadObject



112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/semantic_logger/formatters/color.rb', line 112

def payload
  return unless log.payload?

  if log.payload.respond_to?(:ai)
    begin
      "-- #{log.payload.ai(@ai_options)}"
    rescue StandardError
      super
    end
  else
    super
  end
end

#tagsObject



87
88
89
90
91
92
# File 'lib/semantic_logger/formatters/color.rb', line 87

def tags
  return if log.tags.nil? || log.tags.empty?

  tags = log.tags.map { |tag| escape_control_characters(tag) }
  "[#{color}#{tags.join("#{color_map.clear}] [#{color}")}#{color_map.clear}]"
end