Class: Aspera::Log

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/aspera/log.rb

Overview

Singleton object for logging

Constant Summary collapse

LOG_TYPES =

Where logs are sent to

i[stderr stdout syslog].freeze
LEVELS =

Levels are :trace2,:trace1,:debug,:info,:warn,:error,fatal,:unknown

Logger::Severity.constants.sort{ |a, b| Logger::Severity.const_get(a) <=> Logger::Severity.const_get(b)}.map{ |c| c.downcase.to_sym}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#dump_formatObject

Returns the value of attribute dump_format.



140
141
142
# File 'lib/aspera/log.rb', line 140

def dump_format
  @dump_format
end

#loggerObject (readonly)

Returns the value of attribute logger.



139
140
141
# File 'lib/aspera/log.rb', line 139

def logger
  @logger
end

#logger_typeObject

Returns the value of attribute logger_type.



139
140
141
# File 'lib/aspera/log.rb', line 139

def logger_type
  @logger_type
end

Class Method Details

.apply_colors(value, colors) ⇒ Object

Applies the provided list of string decoration (colors) to the value.

Parameters:

  • value (String)

    Value to enhance.

  • colors (Array(Symbol))

    List of decorations



71
72
73
# File 'lib/aspera/log.rb', line 71

def apply_colors(value, colors)
  colors.inject(value){ |s, c| s.send(c)}
end

.caller_methodObject

Returns the last 2 containers (module/class) and method caller



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/aspera/log.rb', line 114

def caller_method
  stack = caller
  i = stack.rindex{ |line| line.include?('Logger')}
  frame = stack[i + 1] if i && stack[i + 1]
  return '???' unless frame
  # Extract the "Class::Module::Method" or "Class#method" part
  full = frame[/'([^']+)'/, 1]
  return '???' unless full
  # Split into class/module and method parts
  parts = full.split(/(::|#)/)
  # Reconstruct keeping only last two class/module names + separator + method
  if parts.include?('#')
    sep_index = parts.index('#')
    classes = parts[0...sep_index].join
    method = parts[sep_index + 1]
  else
    classes = parts[0..-2].join
    method = parts.last
  end
  class_parts = classes.split('::')
  selected_classes = class_parts.last(2).join('::')
  "#{selected_classes}.#{method}"
end

.capture_stderrObject

Capture the output of $stderr and log it at debug level



104
105
106
107
108
109
110
111
# File 'lib/aspera/log.rb', line 104

def capture_stderr
  real_stderr = $stderr
  $stderr = StringIO.new
  yield if block_given?
  log.debug($stderr.string)
ensure
  $stderr = real_stderr
end

.dump(name, object = nil, level: :debug) ⇒ Object

Dump object (‘Hash`) to log using specified level

Parameters:

  • name (String, Symbol)

    Name of object dumped

  • object (Hash, nil) (defaults to: nil)

    Data to dump

  • level (Symbol) (defaults to: :debug)

    Debug level

  • block (Proc, nil)

    Give computed object



84
85
86
87
88
# File 'lib/aspera/log.rb', line 84

def dump(name, object = nil, level: :debug)
  return unless instance.logger.send(:"#{level}?")
  object = yield if block_given?
  instance.logger.send(level, obj_dump(name, object))
end

.logObject

Get the logger object of singleton



76
# File 'lib/aspera/log.rb', line 76

def log; instance.logger; end

.obj_dump(name, object) ⇒ String

Returns Dump of object.

Returns:



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/aspera/log.rb', line 91

def obj_dump(name, object)
  dump_text =
    case instance.dump_format
    when :json
      JSON.pretty_generate(object) rescue PP.pp(object, +'')
    when :ruby
      PP.pp(object, +'')
    else error_unexpected_value(instance.dump_format){'dump format'}
    end
  "#{name.to_s.green} (#{instance.dump_format})=\n#{dump_text}"
end

Instance Method Details

#formatterObject



165
166
167
# File 'lib/aspera/log.rb', line 165

def formatter
  @logger.formatter
end

#formatter=(formatter) ⇒ Object



154
155
156
157
158
159
160
161
162
163
# File 'lib/aspera/log.rb', line 154

def formatter=(formatter)
  if formatter.is_a?(String)
    raise Error, "Unknown formatter #{formatter}, use one of: #{FORMATTERS.keys.join(', ')}" unless FORMATTERS.key?(formatter.to_sym)
    formatter = FORMATTERS[formatter.to_sym]
  elsif !formatter.respond_to?(:call) && !formatter.is_a?(Logger::Formatter)
    raise Error, 'Formatter must be a String, a Logger::Formatter or a Proc'
  end
  # Update formatter with password hiding
  @logger.formatter = SecretHider.instance.log_formatter(formatter)
end

#levelSymbol

Get symbol of debug level of underlying logger

Returns:

  • (Symbol)

    One of LEVELS



171
172
173
174
# File 'lib/aspera/log.rb', line 171

def level
  Aspera.assert(Logger::SEVERITY_LABEL.key?(@logger.level))
  Logger::SEVERITY_LABEL[@logger.level].downcase
end

#level=(new_level) ⇒ Object

Set log level of underlying logger given symbol level

Parameters:

  • new_level (Symbol)

    One of LEVELS



149
150
151
152
# File 'lib/aspera/log.rb', line 149

def level=(new_level)
  Aspera.assert_values(new_level, LEVELS)
  @logger.level = Logger::Severity.const_get(new_level.to_sym.upcase)
end

#program_name=(value) ⇒ Object



142
143
144
145
# File 'lib/aspera/log.rb', line 142

def program_name=(value)
  @program_name = value
  self.logger_type = @logger_type
end