module R10K::Logging

Constants

LOG_LEVELS
SYSLOG_LEVELS_MAP

Attributes

disable_default_stderr[R]

@!attribute [r] disable_default_stderr

@api private
@return [Boolean]
formatter[R]

@!attribute [r] formatter

@api private
@return [Log4r::Formatter]
level[R]

@!attribute [r] level

@return [Integer] The current log level. Lower numbers correspond
  to more verbose log levels.
outputter[R]

@!attribute [r] outputter

@api private
@return [Log4r::Outputter]
outputters[R]

@!attribute [r] outputters

@api private
@return [Array[Log4r::Outputter]]

Public Class Methods

add_outputters(outputs) click to toggle source
# File lib/r10k/logging.rb, line 90
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
debug_formatter() click to toggle source
# File lib/r10k/logging.rb, line 169
def debug_formatter
  Log4r::PatternFormatter.new(:pattern => '[%d - %l] %m')
end
default_formatter() click to toggle source
# File lib/r10k/logging.rb, line 165
def default_formatter
  Log4r::PatternFormatter.new(:pattern => '%l\t -> %m')
end
default_outputter() click to toggle source
# File lib/r10k/logging.rb, line 173
def default_outputter
  R10K::Logging::TerminalOutputter.new('terminal', $stderr, :level => self.level, :formatter => formatter)
end
disable_default_stderr=(val) click to toggle source
# File lib/r10k/logging.rb, line 85
def disable_default_stderr=(val)
  @disable_default_stderr = val
  outputter.level = val ? Log4r::OFF : @level
end
level=(val) click to toggle source
# File lib/r10k/logging.rb, line 70
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 unless @disable_default_stderr
  @level = level

  if level < Log4r::INFO
    outputter.formatter = debug_formatter
  else
    outputter.formatter = default_formatter
  end
end
parse_level(input) click to toggle source

Convert the input to a valid Log4r log level

@param input [String, TrueClass] The level to parse. If TrueClass then

Log4r::INFO will be returned (indicating a generic raised verbosity),
if a string it will be parsed either as a numeric value or a textual
log level.

@api private @return [Integer, NilClass] The numeric log level, or nil if the log

level is invalid.
# File lib/r10k/logging.rb, line 53
def parse_level(input)
  case input
  when TrueClass
    Log4r::INFO
  when /\A\d+\Z/
    Integer(input)
  when String
    const_name = input.upcase
    if LOG_LEVELS.include?(const_name)
      begin
        Log4r.const_get(const_name.to_sym)
      rescue NameError
      end
    end
  end
end

Public Instance Methods

logger() click to toggle source
# File lib/r10k/logging.rb, line 26
def logger
  if @logger.nil?
    name = logger_name
    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
logger_name() click to toggle source
# File lib/r10k/logging.rb, line 22
def logger_name
  self.class.to_s
end