class Mu::Logger

Constants

LEVELS
MAX_NESTED_LEVELS

Public Class Methods

new(*args) click to toggle source
# File lib/mu/logger.rb, line 19
def initialize(*args)
  @logger = create_logger(args)

  @logger.formatter =
    if ['colored'].include?(ENV['LOG_FORMAT'])
    then Mu::Logging::Formatting.colored_format
    else Mu::Logging::Formatting.json_format
    end

  self.level = LEVELS.index(ENV['LOG_LEVEL']) || ::Logger::INFO
end

Public Instance Methods

for_event(event) click to toggle source
# File lib/mu/logger.rb, line 31
def for_event(event)
  RubyCompatibleLogger.new(event, @logger)
end
mask(key) click to toggle source
# File lib/mu/logger.rb, line 35
def mask(key)
  key = case key
          when String
            /#{key}/
          when Symbol
            /#{key.to_s}/
          when Regexp
            key
        end
  mask_keys << key
end

Private Instance Methods

const_io_stream?(logger_param) click to toggle source

Allow STDOUT or STDERR to be explicitly specified

# File lib/mu/logger.rb, line 67
def const_io_stream?(logger_param)
  logger_param.is_a?(String) &&
    logger_param =~ VALID_RUBY_CONST &&
    Kernel.const_defined?(logger_param)
end
create_logger(args) click to toggle source
# File lib/mu/logger.rb, line 53
def create_logger(args)
  return ::Logger.new(STDOUT)                    if args.empty? # Default to STDOUT
  return args[0]                                 if logger?(args[0])
  return ::Logger.new(Kernel.const_get(args[0])) if const_io_stream?(args[0])

  ::Logger.new(*args)
end
enrich_log_data(data) click to toggle source
# File lib/mu/logger.rb, line 101
def enrich_log_data(data)
  data = mask_values(data)
  prefix_and_flatten_hash(data)
end
log_event(method, event, data = {}) { |extra| ... } click to toggle source
# File lib/mu/logger.rb, line 73
def log_event(method, event, data = {})
  extra = { 'event' => event }
  data.is_a?(Hash) ? extra.merge!(data) : extra['message'] = data

  if block_given?
    t0 = now
    begin
      yield(extra)
    rescue Exception => e
      extra['exception'] = [e.class.name, e.message]
      raise
    ensure
      extra['duration'] = (now - t0)
      @logger.send(method, enrich_log_data(extra))
    end
  else
    @logger.send(method, enrich_log_data(extra))
  end
end
logger?(logger_param) click to toggle source
# File lib/mu/logger.rb, line 61
def logger?(logger_param)
  # Allow use of pre-existing Logger
  logger_param.is_a?(::Logger)
end
mask_keys() click to toggle source
# File lib/mu/logger.rb, line 49
def mask_keys
  @mask_keys ||= []
end
mask_values(data) click to toggle source
# File lib/mu/logger.rb, line 106
def mask_values(data)
  data.each { |k, v| data[k] = v.gsub(/./, '#')  if should_mask?(k)}
end
method_missing(meth, *args, &block) click to toggle source
# File lib/mu/logger.rb, line 93
def method_missing(meth, *args, &block)
  @logger.send(meth, *args, &block)
end
now() click to toggle source
# File lib/mu/logger.rb, line 97
def now
  Time.now.to_f * 1000
end
prefix_and_flatten_hash(hash, prefix = '', level = 1) click to toggle source
# File lib/mu/logger.rb, line 117
def prefix_and_flatten_hash(hash, prefix = '', level = 1)
  if level > MAX_NESTED_LEVELS
    return { "#{prefix}TRUNCATED" => "data nested deeper than #{MAX_NESTED_LEVELS} levels has been truncated" }
  end

  hash.inject({}) do |ret, (k, v)|
    key = prefix + k.to_s
    if v && v.is_a?(Hash)
    then ret.merge(prefix_and_flatten_hash(v, key + '.', level + 1))
    else ret.merge(key => v)
    end
  end
end
should_mask?(key) click to toggle source
# File lib/mu/logger.rb, line 110
def should_mask?(key)
  return false unless @mask_keys
  @mask_keys.find {|maskable| key =~ maskable }
end