lib/r10k/logging.rb in r10k-3.12.1 vs lib/r10k/logging.rb in r10k-3.13.0
- old
+ new
@@ -6,10 +6,20 @@
require 'r10k/logging/terminaloutputter'
module R10K::Logging
LOG_LEVELS = %w{DEBUG2 DEBUG1 DEBUG INFO NOTICE WARN ERROR FATAL}
+ SYSLOG_LEVELS_MAP = {
+ 'DEBUG2' => 'DEBUG',
+ 'DEBUG1' => 'DEBUG',
+ 'DEBUG' => 'DEBUG',
+ 'INFO' => 'INFO',
+ 'NOTICE' => 'INFO',
+ 'WARN' => 'WARN',
+ 'ERROR' => 'ERROR',
+ 'FATAL' => 'FATAL',
+ }.freeze
def logger_name
self.class.to_s
end
@@ -19,10 +29,13 @@
if Log4r::Logger[name]
@logger = Log4r::Logger[name]
else
@logger = Log4r::Logger.new(name)
@logger.add(R10K::Logging.outputter)
+ R10K::Logging.outputters.each do |output|
+ @logger.add(output)
+ end
end
end
@logger
end
@@ -57,20 +70,72 @@
def level=(val)
level = parse_level(val)
if level.nil?
raise ArgumentError, _("Invalid log level '%{val}'. Valid levels are %{log_levels}") % {val: val, log_levels: LOG_LEVELS.map(&:downcase).inspect}
end
- outputter.level = level
+ outputter.level = level unless @disable_default_stderr
@level = level
if level < Log4r::INFO
outputter.formatter = debug_formatter
else
outputter.formatter = default_formatter
end
end
+ def disable_default_stderr=(val)
+ @disable_default_stderr = val
+ outputter.level = val ? Log4r::OFF : @level
+ end
+
+ def add_outputters(outputs)
+ outputs.each do |output|
+ type = output.fetch(:type)
+ # Support specifying both short as well as full names
+ type = type.to_s[0..-10] if type.to_s.downcase.end_with? 'outputter'
+
+ name = output.fetch(:name, 'r10k')
+ if output[:level]
+ level = parse_level(output[:level])
+ if level.nil?
+ raise ArgumentError, _("Invalid log level '%{val}'. Valid levels are %{log_levels}") % { val: output[:level], log_levels: LOG_LEVELS.map(&:downcase).inspect }
+ end
+ else
+ level = self.level
+ end
+ only_at = output[:only_at]
+ only_at&.map! do |val|
+ lv = parse_level(val)
+ if lv.nil?
+ raise ArgumentError, _("Invalid log level '%{val}'. Valid levels are %{log_levels}") % { val: val, log_levels: LOG_LEVELS.map(&:downcase).inspect }
+ end
+
+ lv
+ end
+ parameters = output.fetch(:parameters, {}).merge({ level: level })
+
+ begin
+ # Try to load the outputter file if possible
+ require "log4r/outputter/#{type.to_s.downcase}outputter"
+ rescue LoadError
+ false
+ end
+ outputtertype = Log4r.constants
+ .select { |klass| klass.to_s.end_with? 'Outputter' }
+ .find { |klass| klass.to_s.downcase == "#{type.to_s.downcase}outputter" }
+ raise ArgumentError, "Unable to find a #{output[:type]} outputter." unless outputtertype
+
+ outputter = Log4r.const_get(outputtertype).new(name, parameters)
+ outputter.only_at(*only_at) if only_at
+ # Handle log4r's syslog mapping correctly
+ outputter.map_levels_by_name_to_syslog(SYSLOG_LEVELS_MAP) if outputter.respond_to? :map_levels_by_name_to_syslog
+
+ @outputters << outputter
+ Log4r::Logger.global.add outputter
+ end
+ end
+
extend Forwardable
def_delegators :@outputter, :use_color, :use_color=
# @!attribute [r] level
# @return [Integer] The current log level. Lower numbers correspond
@@ -85,10 +150,20 @@
# @!attribute [r] outputter
# @api private
# @return [Log4r::Outputter]
attr_reader :outputter
+ # @!attribute [r] outputters
+ # @api private
+ # @return [Array[Log4r::Outputter]]
+ attr_reader :outputters
+
+ # @!attribute [r] disable_default_stderr
+ # @api private
+ # @return [Boolean]
+ attr_reader :disable_default_stderr
+
def default_formatter
Log4r::PatternFormatter.new(:pattern => '%l\t -> %m')
end
def debug_formatter
@@ -104,6 +179,8 @@
Log4r::Logger.global.level = Log4r::ALL
@level = Log4r::WARN
@formatter = default_formatter
@outputter = default_outputter
+ @outputters = []
+ @disable_default_stderr = false
end