2 # A simple class that allows logging at various levels.
7 VALID_LEVELS = [:error, :fatal, :debug, :warn, :info]
9 # Obtain the class name of the currently configured logger
39 # handle old code that relied on this class being a singleton
44 # increments the active log level
46 @logger.cycle_level if @configured
49 def config_and_check_level(level)
50 configure unless @configured
52 @logger.should_log?(level)
55 def check_level(level)
56 raise "Unknown log level" unless valid_level?(level)
59 def valid_level?(level)
60 VALID_LEVELS.include?(level)
63 def message_for(msgid, args={})
64 "%s: %s" % [msgid, Util.t(msgid, args)]
67 def logexception(msgid, level, e, backtrace=false, args={})
68 return false unless config_and_check_level(level)
70 origin = File.basename(e.backtrace[1])
72 if e.is_a?(CodedError)
73 msg = "%s: %s" % [e.code, e.to_s]
75 error_string = "%s: %s" % [e.class, e.to_s]
76 msg = message_for(msgid, args.merge(:error => error_string))
79 log(level, msg, origin)
82 e.backtrace.each do |line|
83 log(level, "%s: %s" % [msgid, line], origin)
88 # Logs a message at a certain level, the message must be
89 # a token that will be looked up from the i18n localization
92 # Messages can interprolate strings from the args hash, a
93 # message with "foo %{bar}" in the localization database
94 # will use args[:bar] for the value there, the interprolation
95 # is handled by the i18n library itself
96 def logmsg(msgid, default, level, args={})
97 return false unless config_and_check_level(level)
99 msg = message_for(msgid, {:default => default}.merge(args))
104 # logs a message at a certain level
105 def log(level, msg, origin=nil)
106 return unless config_and_check_level(level)
108 origin = from unless origin
111 @logger.log(level, origin, msg)
113 t = Time.new.strftime("%H:%M:%S")
115 STDERR.puts "#{t}: #{level}: #{origin}: #{msg}"
119 # sets the logger class to use
120 def set_logger(logger)
124 # configures the logger class, if the config has not yet been loaded
125 # we default to the console logging class and do not set @configured
126 # so that future calls to the log method will keep attempting to configure
127 # the logger till we eventually get a logging preference from the config
129 def configure(logger=nil)
131 logger_type = "console"
133 config = Config.instance
136 logger_type = config.logger_type
140 require "mcollective/logger/%s_logger" % logger_type.downcase
142 logger_class = MCollective::Logger.const_get("%s_logger" % logger_type.capitalize)
144 set_logger(logger_class.new)
152 rescue Exception => e
154 STDERR.puts "Could not start logger: #{e.class} #{e}"
162 # figures out the filename that called us
164 from = File.basename(caller[2])