diff options
author | Doug Hellmann <doug.hellmann@gmail.com> | 2012-04-21 08:01:57 -0700 |
---|---|---|
committer | Doug Hellmann <doug.hellmann@gmail.com> | 2012-04-21 08:01:57 -0700 |
commit | 21b06cd2be7d42a04bad1db1428fb3269ad38fa1 (patch) | |
tree | 57b127493f9b972fe87a0a7321ae9d33dab82518 | |
parent | 6f1f61eb340a643b749622dd3aa5165a4efd9f2c (diff) | |
download | cliff-tablib-21b06cd2be7d42a04bad1db1428fb3269ad38fa1.tar.gz |
use logging for controlling console output verbosity
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | cliff/app.py | 53 | ||||
-rw-r--r-- | demoapp/cliffdemo/simple.py | 6 |
3 files changed, 55 insertions, 7 deletions
@@ -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 3438e1c..a285c92 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,10 +34,18 @@ 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 ccfd7ef..f4a16f8 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!') |