X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=lib%2Fmcollective%2Flogger%2Fbase.rb;fp=lib%2Fmcollective%2Flogger%2Fbase.rb;h=9bdc530705ab3e505314b69382c8e11f34df9472;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/lib/mcollective/logger/base.rb b/lib/mcollective/logger/base.rb new file mode 100644 index 0000000..9bdc530 --- /dev/null +++ b/lib/mcollective/logger/base.rb @@ -0,0 +1,77 @@ +module MCollective + module Logger + # A base class for logging providers. + # + # Logging providers should provide the following: + # + # * start - all you need to do to setup your logging + # * set_logging_level - set your logging to :info, :warn, etc + # * valid_levels - a hash of maps from :info to your internal level name + # * log - what needs to be done to log a specific message + class Base + attr_reader :active_level + + def initialize + @known_levels = [:debug, :info, :warn, :error, :fatal] + + # Sanity check the class that impliments the logging + @known_levels.each do |lvl| + raise "Logger class did not specify a map for #{lvl}" unless valid_levels.include?(lvl) + end + end + + def should_log?(level) + @known_levels.index(level) >= @known_levels.index(@active_level) + end + + # Figures out the next level and sets it + def cycle_level + lvl = get_next_level + set_level(lvl) + + log(lvl, "", "Logging level is now #{lvl.to_s.upcase}") + end + + # Sets a new level and record it in @active_level + def set_level(level) + set_logging_level(level) + @active_level = level.to_sym + end + + private + def map_level(level) + raise "Logger class do not know how to handle #{level} messages" unless valid_levels.include?(level.to_sym) + + valid_levels[level.to_sym] + end + + # Gets the next level in the list, cycles down to the firt once it reaches the end + def get_next_level + # if all else fails, always go to debug mode + nextlvl = :debug + + if @known_levels.index(@active_level) == (@known_levels.size - 1) + nextlvl = @known_levels.first + else + idx = @known_levels.index(@active_level) + 1 + nextlvl = @known_levels[idx] + end + + nextlvl + end + + # Abstract methods to ensure the logging implimentations supply what they should + def valid_levels + raise "The logging class did not supply a valid_levels method" + end + + def log(level, from, msg) + raise "The logging class did not supply a log method" + end + + def start + raise "The logging class did not supply a start method" + end + end + end +end