class Makitzo::Logging::Collector

A logger which collects all log messages and displays a summary by host

Attributes

use_color[RW]

Public Class Methods

new() click to toggle source
# File lib/makitzo/logging/collector.rb, line 11
def initialize
  @use_color = true
  @host = nil
  @messages = []
  @hosts = Hash.new { |h,k| h[k] = {:error => false, :messages => []} }
  @lock = Mutex.new
  @silenced = false
end

Public Instance Methods

append(*chunks) click to toggle source
# File lib/makitzo/logging/collector.rb, line 141
def append(*chunks)
  unless @silenced
    @lock.synchronize do
      active_log << chunks.join('').strip
    end
  end
end
collector?() click to toggle source
# File lib/makitzo/logging/collector.rb, line 117
def collector?
  true
end
debug(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 113
def debug(message)
  append blue('[DEBUG]', true), ' ', sanitize(message)
end
error(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 92
def error(message)
  append red("[ERROR]", true), ' ', red(sanitize(message))
  overall_error! if current_host
end
info(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 109
def info(message)
  append '[INFO]', ' ', sanitize(message)
end
log_command(status, options = {}) click to toggle source

logs a command options - override command line to be logged. useful for masking passwords.

# File lib/makitzo/logging/collector.rb, line 47
def log_command(status, options = {})
  command = options[:command] || status.command
  
  log_command_line(command, status.success?)
  log_command_status(status)
  
  overall_error! if current_host && !status.success?
end
log_command_line(command, success = true) click to toggle source
# File lib/makitzo/logging/collector.rb, line 56
def log_command_line(command, success = true)
  if command.is_a?(Net::SSH::Connection::Session::ExecStatus)
    success = command.success?
    command = command.command
  end
  if success
    append green("$", true), " ", green(sanitize(command))
  else
    append red("$", true), " ", red(sanitize(command))
  end
end
log_command_status(result, success = true) click to toggle source
# File lib/makitzo/logging/collector.rb, line 68
def log_command_status(result, success = true)
  if result.is_a?(Net::SSH::Connection::Session::ExecStatus)
    success = result.success?
    result  = (success ? result.stdout : result.stderr).last_line.strip
  end
  unless result.empty?
    if success
      append green("-", true), " ", green(sanitize(result))
    else
      append red("!", true), " ", red(sanitize(result))
    end
  end
end
notice(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 101
def notice(message)
  append cyan("[NOTICE]", true), ' ', sanitize(message)
end
overall_error!() click to toggle source
# File lib/makitzo/logging/collector.rb, line 87
def overall_error!
  raise "Cannot log host error when no host is set" unless current_host
  @hosts[current_host.to_s][:error] = true
end
overall_success!() click to toggle source
# File lib/makitzo/logging/collector.rb, line 82
def overall_success!
  raise "Cannot log host success when no host is set" unless current_host
  @hosts[current_host.to_s][:error] = false
end
result() click to toggle source
# File lib/makitzo/logging/collector.rb, line 121
def result
  out = ""
  
  @hosts.keys.sort.each do |host_name|
    host_status = @hosts[host_name]
    next if host_status[:messages].empty?
    out << magenta('* ' + host_name, true) << " " << (host_status[:error] ? red('[ERROR]', true) : green('[OK]', true)) << "\n"
    host_status[:messages].each { |m| out << m.indent(2) << "\n" }
    out << "\n"
  end
  
  unless @messages.empty?
    out << magenta("* Global Messages", true) << "\n"
    @messages.each { |m| out << m.indent(2) << "\n" }
    out << "\n"
  end
  
  out
end
silence() { || ... } click to toggle source

This method is not threadsafe. So call it before spawning threads.

# File lib/makitzo/logging/collector.rb, line 21
def silence(&block)
  begin
    was_silenced = @silenced
    @silenced = true
    yield if block_given?
  ensure
    @silenced = was_silenced
  end
end
success(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 97
def success(message)
  append green("[OK]", true), ' ', sanitize(message)
end
use_color?() click to toggle source
# File lib/makitzo/logging/collector.rb, line 9
def use_color?; !!@use_color; end
warn(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 105
def warn(message)
  append yellow("[WARNING]", true), ' ', sanitize(message)
end
with_host(host) { || ... } click to toggle source
# File lib/makitzo/logging/collector.rb, line 31
def with_host(host, &block)
  return unless block_given?
  
  begin
    set_current_host(host)
    info("host is #{host.address}")
    yield
  ensure
    set_current_host(nil)
  end
  
  nil
end

Private Instance Methods

active_log() click to toggle source
# File lib/makitzo/logging/collector.rb, line 155
def active_log
  current_host ? @hosts[current_host.to_s][:messages] : @messages
end
current_host() click to toggle source
# File lib/makitzo/logging/collector.rb, line 159
def current_host
  Thread.current[THREAD_HOST_KEY]
end
sanitize(message) click to toggle source
# File lib/makitzo/logging/collector.rb, line 151
def sanitize(message)
  message.to_s
end
set_current_host(host) click to toggle source
# File lib/makitzo/logging/collector.rb, line 163
def set_current_host(host)
  raise "Cannot set host; host already set" if host && current_host
  Thread.current[THREAD_HOST_KEY] = host
end