summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Hellmann <doug.hellmann@gmail.com>2012-04-21 08:01:57 -0700
committerDoug Hellmann <doug.hellmann@gmail.com>2012-04-21 08:01:57 -0700
commit21b06cd2be7d42a04bad1db1428fb3269ad38fa1 (patch)
tree57b127493f9b972fe87a0a7321ae9d33dab82518
parent6f1f61eb340a643b749622dd3aa5165a4efd9f2c (diff)
downloadcliff-tablib-21b06cd2be7d42a04bad1db1428fb3269ad38fa1.tar.gz
use logging for controlling console output verbosity
-rw-r--r--.gitignore3
-rw-r--r--cliff/app.py53
-rw-r--r--demoapp/cliffdemo/simple.py6
3 files changed, 55 insertions, 7 deletions
diff --git a/.gitignore b/.gitignore
index f24cd99..32e2d9e 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 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!')