summaryrefslogtreecommitdiff
path: root/lib/leap_cli/log.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/leap_cli/log.rb')
-rw-r--r--lib/leap_cli/log.rb132
1 files changed, 86 insertions, 46 deletions
diff --git a/lib/leap_cli/log.rb b/lib/leap_cli/log.rb
index ab361d5..fb43d7b 100644
--- a/lib/leap_cli/log.rb
+++ b/lib/leap_cli/log.rb
@@ -1,5 +1,4 @@
require 'paint'
-require 'tee'
##
## LOGGING
@@ -30,13 +29,16 @@ module LeapCli
end
def log_file=(value)
@log_file = value
- if value
- @log_output_stream = Tee.open(@log_file, :mode => 'a')
+ 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
def log_output_stream
- @log_output_stream || STDOUT
+ @log_output_stream
end
end
@@ -67,55 +69,93 @@ module LeapCli
title = args.grep(Symbol).first
message = args.grep(String).first
options = args.grep(Hash).first || {}
- options[:indent] ||= LeapCli.indent_level
- if message && LeapCli.log_level >= level
- line = ""
- line += " " * (options[:indent])
- if options[:indent] > 0
- line += ' - '
+ unless message && LeapCli.log_level >= level
+ return
+ end
+
+ # prefix
+ clear_prefix = colored_prefix = ""
+ if title
+ prefix_options = case title
+ when :error then ['error', :red, :bold]
+ when :warning then ['warning', :yellow, :bold]
+ when :info then ['info', :cyan, :bold]
+ when :updated then ['updated', :cyan, :bold]
+ when :updating then ['updating', :cyan, :bold]
+ when :created then ['created', :green, :bold]
+ when :removed then ['removed', :red, :bold]
+ when :nochange then ['no change', :magenta]
+ when :loading then ['loading', :magenta]
+ when :missing then ['missing', :yellow, :bold]
+ when :skipping then ['skipping', :yellow, :bold]
+ when :run then ['run', :magenta]
+ when :failed then ['FAILED', :red, :bold]
+ when :completed then ['completed', :green, :bold]
+ when :ran then ['ran', :green, :bold]
+ when :bail then ['bailing out', :red, :bold]
+ when :invalid then ['invalid', :red, :bold]
+ else [title.to_s, :cyan, :bold]
+ end
+ if options[:host]
+ clear_prefix = "[%s] %s " % options[:host], prefix_options[0]
+ colored_prefix = "[%s] %s " % [Paint[options[:host], prefix_options[1], prefix_options[2]], prefix_options[0]]
else
- line += ' = '
+ clear_prefix = "%s " % prefix_options[0]
+ colored_prefix = "%s " % Paint[prefix_options[0], prefix_options[1], prefix_options[2]]
end
- if title
- prefix = case title
- when :error then ['error', :red, :bold]
- when :warning then ['warning', :yellow, :bold]
- when :info then ['info', :cyan, :bold]
- when :updated then ['updated', :cyan, :bold]
- when :updating then ['updating', :cyan, :bold]
- when :created then ['created', :green, :bold]
- when :removed then ['removed', :red, :bold]
- when :nochange then ['no change', :magenta]
- when :loading then ['loading', :magenta]
- when :missing then ['missing', :yellow, :bold]
- when :skipping then ['skipping', :yellow, :bold]
- when :run then ['run', :magenta]
- when :failed then ['FAILED', :red, :bold]
- when :completed then ['completed', :green, :bold]
- when :ran then ['ran', :green, :bold]
- when :bail then ['bailing out', :red, :bold]
- when :invalid then ['invalid', :red, :bold]
- else [title.to_s, :cyan, :bold]
+ elsif options[:host]
+ clear_prefix = colored_prefix = "[%s] " % options[:host]
+ end
+
+ # transform absolute path names
+ if title && FILE_TITLES.include?(title) && message =~ /^\//
+ message = LeapCli::Path.relative_path(message)
+ end
+
+ log_raw(:log, nil) { [clear_prefix, message].join }
+ log_raw(:stdout, options[:indent]) { [colored_prefix, message].join }
+
+ # run block, if given
+ if block_given?
+ LeapCli.indent_level += 1
+ yield
+ LeapCli.indent_level -= 1
+ end
+ end
+
+ #
+ # Add a raw log entry, without any modifications (other than indent).
+ # Content to be logged is yielded by the block.
+ #
+ # if mode == :stdout, output is sent to STDOUT.
+ # if mode == :log, output is sent to log file, if present.
+ #
+ def log_raw(mode, indent=nil, &block)
+ # NOTE: print message (using 'print' produces better results than 'puts' when multiple threads are logging)
+ if mode == :log
+ if LeapCli.log_output_stream
+ message = yield
+ if message
+ timestamp = Time.now.strftime("%b %d %H:%M:%S")
+ LeapCli.log_output_stream.print("#{timestamp} #{message}\n")
+ LeapCli.log_output_stream.flush
end
- if options[:host]
- line += "[%s] %s " % [Paint[options[:host], prefix[1], prefix[2]], prefix[0]]
+ end
+ elsif mode == :stdout
+ message = yield
+ if message
+ indent ||= LeapCli.indent_level
+ indent_str = ""
+ indent_str += " " * indent.to_i
+ if indent.to_i > 0
+ indent_str += ' - '
else
- line += "%s " % Paint[prefix[0], prefix[1], prefix[2]]
- end
- if FILE_TITLES.include?(title) && message =~ /^\//
- message = LeapCli::Path.relative_path(message)
+ indent_str += ' = '
end
- elsif options[:host]
- line += "[%s] " % options[:host]
- end
- line += "#{message}\n"
- LeapCli.log_output_stream.print(line)
- if block_given?
- LeapCli.indent_level += 1
- yield
- LeapCli.indent_level -= 1
+ STDOUT.print("#{indent_str}#{message}\n")
end
end
end
+
end
end \ No newline at end of file