diff --git a/.gitignore b/.gitignore index f24cd995..32e2d9ef 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ pip-log.txt #Mr Developer .mr.developer.cfg + +#sample output +*.log diff --git a/cliff/app.py b/cliff/app.py index 3438e1c2..a285c928 100644 --- a/cliff/app.py +++ b/cliff/app.py @@ -2,6 +2,7 @@ """ import logging +import logging.handlers import optparse import os import sys @@ -13,7 +14,11 @@ class App(object): """Application base class. """ - NAME = os.path.basename(sys.argv[0]) + NAME = os.path.splitext(os.path.basename(sys.argv[0]))[0] + + CONSOLE_MESSAGE_FORMAT = '%(message)s' + LOG_FILE_MESSAGE_FORMAT = '%(asctime)s %(levelname)s %(name)s %(message)s' + DEFAULT_VERBOSE_LEVEL = 1 def __init__(self, description, version, command_manager): self.command_manager = command_manager @@ -29,9 +34,17 @@ class App(object): self.parser.add_option( '-v', '--verbose', action='count', - dest='verbose', + dest='verbose_level', + default=self.DEFAULT_VERBOSE_LEVEL, help='Increase verbosity of output. Can be repeated.', ) + self.parser.add_option( + '-q', '--quiet', + action='store_const', + dest='verbose_level', + const=0, + help='suppress output except warnings and errors', + ) self.parser.add_option( '-h', action='help', help="show this help message and exit", @@ -51,15 +64,43 @@ class App(object): factory = ep.load() cmd = factory(self, None) print(' %-13s %s' % (name, cmd.get_description())) - raise SystemExit() + sys.exit(0) + + def configure_logging(self): + """Create logging handlers for any log output. + """ + root_logger = logging.getLogger('') + + # Set up logging to a file + root_logger.setLevel(logging.DEBUG) + file_handler = logging.handlers.RotatingFileHandler( + self.NAME + '.log', + maxBytes=10240, + backupCount=1, + ) + formatter = logging.Formatter(self.LOG_FILE_MESSAGE_FORMAT) + file_handler.setFormatter(formatter) + root_logger.addHandler(file_handler) + + # Send higher-level messages to the console, too + console = logging.StreamHandler() + console_level = {0: logging.WARNING, + 1: logging.INFO, + 2: logging.DEBUG, + }.get(self.options.verbose_level, logging.DEBUG) + console.setLevel(console_level) + formatter = logging.Formatter(self.CONSOLE_MESSAGE_FORMAT) + console.setFormatter(formatter) + root_logger.addHandler(console) + return def run(self, argv): if not argv: argv = ['-h'] - app_options, remainder = self.parser.parse_args(argv) - # FIXME(dhellmann): set up logging based on verbosity flag + self.options, remainder = self.parser.parse_args(argv) + self.configure_logging() cmd_factory, cmd_name, sub_argv = self.command_manager.find_command(remainder) - cmd = cmd_factory(self, app_options) + cmd = cmd_factory(self, self.options) cmd_parser = cmd.get_parser(' '.join([self.NAME, cmd_name])) parsed_args = cmd_parser.parse_args(sub_argv) return cmd.run(parsed_args) diff --git a/demoapp/cliffdemo/simple.py b/demoapp/cliffdemo/simple.py index ccfd7ef7..f4a16f8a 100644 --- a/demoapp/cliffdemo/simple.py +++ b/demoapp/cliffdemo/simple.py @@ -1,3 +1,4 @@ +import logging from cliff.command import Command @@ -5,5 +6,8 @@ from cliff.command import Command class Simple(Command): "A simple command that prints a message." + log = logging.getLogger(__name__) + def run(self, parsed_args): - print 'hi!' + self.log.debug('debugging') + self.log.info('hi!')