module Methadone
# Provides easier access to a shared Methadone::CLILogger instance.
#
# Include this module into your class, and #logger provides access to a shared logger.
# This is handy if you want all of your clases to have access to the same logger, but
# don't want to (or aren't able to) pass it around to each class.
#
# This also provides methods for direct logging without going through the #logger
#
# === Example
#
# class MyClass
# include Methadone::CLILogger
#
# def doit
# debug("About to doit!")
# if results
# info("We did it!"
# else
# error("Something went wrong")
# end
# debug("Done doing it")
# end
# end
module CLILogging
def self.included(k)
k.extend(self)
end
# Access the shared logger. All classes that include this module
# will get the same logger via this method.
def logger
@@logger ||= CLILogger.new
end
# Change the global logger that includers will use. Useful if you
# don't want the default configured logger. Note that the +change_logger+
# version is preferred because Ruby will often parse logger = Logger.new as
# the declaration of, and assignment to, of a local variable. You'd need to
# do self.logger=Logger.new to be sure. This method
# is a bit easier.
#
# +new_logger+:: the new logger. May not be nil and should be a logger of some kind
def change_logger(new_logger)
raise ArgumentError,"Logger may not be nil" if new_logger.nil?
@@logger = new_logger
@@logger.level = @log_level if @log_level
end
alias logger= change_logger
# pass-through to logger.debug(progname,&block)
def debug(progname = nil, &block); logger.debug(progname,&block); end
# pass-through to logger.info(progname,&block)
def info(progname = nil, &block); logger.info(progname,&block); end
# pass-through to logger.warn(progname,&block)
def warn(progname = nil, &block); logger.warn(progname,&block); end
# pass-through to logger.error(progname,&block)
def error(progname = nil, &block); logger.error(progname,&block); end
# pass-through to logger.fatal(progname,&block)
def fatal(progname = nil, &block); logger.fatal(progname,&block); end
LOG_LEVELS = {
'debug' => Logger::DEBUG,
'info' => Logger::INFO,
'warn' => Logger::WARN,
'error' => Logger::ERROR,
'fatal' => Logger::FATAL,
}
# Call this *if* you've included Methadone::Main to set up a --log-level option for your app
# that will allow the user to configure the logging level.
#
# Example:
#
# main do
# # your app
# end
#
# use_log_level_option
#
# go!
#
def use_log_level_option
on("--log-level LEVEL",LOG_LEVELS,'Set the logging level',
'(' + LOG_LEVELS.keys.join('|') + ')',
'(Default: info)') do |level|
@log_level = level
logger.level = level
end
end
end
end