class LeapCli::LeapLogger

Constants

BG_COLORS
DEBUG
EFFECTS
FG_COLORS
FILE_TITLES

these are log titles typically associated with files

IMPORTANT

TODO: use these

INFO
NO_COLOR
TRACE

Attributes

indent_level[RW]
log_file[R]
log_in_color[RW]
log_level[RW]
log_output_stream[R]

Public Class Methods

new() click to toggle source
# File lib/leap_cli/log.rb, line 65
def initialize()
  @log_level = 1
  @indent_level = 0
  @log_file = nil
  @log_output_stream = nil
  @log_in_color = true
end

Public Instance Methods

colorize(str, color, style=nil) click to toggle source
# File lib/leap_cli/log.rb, line 226
def colorize(str, color, style=nil)
  codes = [FG_COLORS[color] || FG_COLORS[:default]]
  if style
    codes << EFFECTS[style] || EFFECTS[:nothing]
  end
  if str.is_a?(String)
    ["\033[%sm" % codes.join(';'), str, NO_COLOR].join
  elsif str.is_a?(Array)
    str.map { |s|
      ["\033[%sm" % codes.join(';'), s, NO_COLOR].join
    }
  end
end
debug(*args) click to toggle source
# File lib/leap_cli/log.rb, line 177
def debug(*args)
  self.log(3, *args)
end
log(*args) { || ... } click to toggle source

master logging function.

arguments can be a String, Integer, Symbol, or Hash, in any order.

  • String: treated as the message to log.

  • Integer: the log level (0, 1, 2)

  • Symbol: the prefix title to colorize. may be one of

    :error, :warning, :info, :updated, :created, :removed, :no_change, :missing
  • Hash: a hash of options.

    :wrap -- if true, appy intend to each line in message.
    :color -- apply color to message or prefix
    :style -- apply style to message or prefix
# File lib/leap_cli/log.rb, line 97
def log(*args)
  level   = args.grep(Integer).first || 1
  title   = args.grep(Symbol).first
  message = args.grep(String).first
  options = args.grep(Hash).first || {}
  host    = options[:host]
  if title
    title = title.to_s
  end
  if @log_level < level || (title.nil? && message.nil?)
    return
  end

  #
  # transform absolute path names
  #
  if title && FILE_TITLES.include?(title) && message =~ /^\//
    message = LeapCli::Path.relative_path(message)
  end

  #
  # apply filters
  # LogFilter will not be defined if no platform was loaded.
  #
  if defined?(LeapCli::LogFilter)
    if title
      title, filter_flags = LogFilter.apply_title_filters(title)
    else
      message, filter_flags = LogFilter.apply_message_filters(message)
      return if message.nil?
    end
    options = options.merge(filter_flags)
  end

  #
  # set line prefix
  #
  if (host)
    host = host.split('.').first
  end
  prefix = prefix_str(host, title)

  #
  # write to the log file, always
  #
  log_raw(:log, nil, prefix) { message }

  #
  # log to stdout, maybe in color
  #
  if @log_in_color
    if options[:wrap]
      message = message.split("\n")
    end
    if options[:color]
      if host
        host = colorize(host, options[:color], options[:style])
      elsif title
        title = colorize(title, options[:color], options[:style])
      else
        message = colorize(message, options[:color], options[:style])
      end
    elsif title
      title = colorize(title, :cyan, :bold)
    end
    # new colorized prefix:
    prefix = prefix_str(host, title)
  end
  log_raw(:stdout, options[:indent], prefix) { message }

  #
  # run block indented, if given
  #
  if block_given?
    @indent_level += 1
    yield
    @indent_level -= 1
  end
end
log_file=(value) click to toggle source
# File lib/leap_cli/log.rb, line 73
def log_file=(value)
  @log_file = value
  if @log_file
    if !File.directory?(File.dirname(@log_file))
      Util.bail!('Invalid log file "%s", directory "%s" does not exist' % [@log_file, File.dirname(@log_file)])
    end
    @log_output_stream = File.open(@log_file, 'a')
  end
end
log_raw(mode, indent=nil, prefix=nil) { |].flatten| ... } click to toggle source

Add a raw log entry, without any modifications (other than indent). Content to be logged is yielded by the block. Block may be either a string or array of strings.

if mode == :stdout, output is sent to STDOUT. if mode == :log, output is sent to log file, if present.

# File lib/leap_cli/log.rb, line 189
def log_raw(mode, indent=nil, prefix=nil, &block)
  # NOTE: using 'print' produces better results than 'puts'
  # when multiple threads are logging)
  if mode == :log
    if @log_output_stream
      messages = [yield].compact.flatten
      if messages.any?
        timestamp = Time.now.strftime("%b %d %H:%M:%S")
        messages.each do |message|
          message = message.rstrip
          next if message.empty?
          @log_output_stream.print("#{timestamp} #{prefix} #{message}\n")
        end
        @log_output_stream.flush
      end
    end
  elsif mode == :stdout
    messages = [yield].compact.flatten
    if messages.any?
      indent ||= @indent_level
      indent_str = ""
      indent_str += "  " * indent.to_i
      if indent.to_i > 0
        indent_str += ' - '
      else
        indent_str += ' = '
      end
      indent_str += prefix if prefix
      messages.each do |message|
        message = message.rstrip
        next if message.empty?
        STDOUT.print("#{indent_str}#{message}\n")
      end
    end
  end
end

Private Instance Methods

prefix_str(host, title) click to toggle source
# File lib/leap_cli/log.rb, line 242
def prefix_str(host, title)
  prefix = ""
  prefix += "[" + host + "] " if host
  prefix += title + " " if title
  prefix += " " if !prefix.empty? && prefix !~ / $/
  return prefix
end