summaryrefslogtreecommitdiff
path: root/openstackclient/common/context.py
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-09-09 20:15:54 +0000
committerGerrit Code Review <review@openstack.org>2015-09-09 20:15:54 +0000
commit46696f5ed55c9313754e7019e727ee88fa0847ce (patch)
tree1ff427cc41e180b0216178ea83416161cf3878e7 /openstackclient/common/context.py
parentcd54db874154ab668fe7ecc34d247f1dac62896e (diff)
parent85a03945f0b5da0ec5778a929e08a641f427513a (diff)
downloadpython-openstackclient-46696f5ed55c9313754e7019e727ee88fa0847ce.tar.gz
Merge "Create log configuration class"
Diffstat (limited to 'openstackclient/common/context.py')
-rw-r--r--openstackclient/common/context.py144
1 files changed, 70 insertions, 74 deletions
diff --git a/openstackclient/common/context.py b/openstackclient/common/context.py
index 57091939..6d1aec13 100644
--- a/openstackclient/common/context.py
+++ b/openstackclient/common/context.py
@@ -11,9 +11,10 @@
# under the License.
#
-"""Context and Formatter"""
+"""Application logging"""
import logging
+import sys
import warnings
@@ -99,76 +100,71 @@ class _FileFormatter(logging.Formatter):
logging.Formatter.__init__(self, self.fmt, self._LOG_DATE_FORMAT)
-def setup_handler_logging_level(handler_type, level):
- """Setup of the handler for set the logging level
-
- :param handler_type: type of logging handler
- :param level: logging level
- :return: None
- """
- # Set the handler logging level of FileHandler(--log-file)
- # and StreamHandler
- for h in logging.getLogger('').handlers:
- if type(h) is handler_type:
- h.setLevel(level)
-
-
-def setup_logging(shell, cloud_config):
- """Get one cloud configuration from configuration file and setup logging
-
- :param shell: instance of openstackclient shell
- :param cloud_config:
- instance of the cloud specified by --os-cloud
- in the configuration file
- :return: None
- """
-
- log_level = log_level_from_config(cloud_config.config)
- set_warning_filter(log_level)
-
- log_file = cloud_config.config.get('log_file', None)
- if log_file:
- # setup the logging context
- formatter = _FileFormatter(config=cloud_config)
- # setup the logging handler
- log_handler = _setup_handler_for_logging(
- logging.FileHandler,
- log_level,
- file_name=log_file,
- formatter=formatter,
- )
- if log_level == logging.DEBUG:
- # DEBUG only.
- # setup the operation_log
- shell.enable_operation_logging = True
- shell.operation_log.setLevel(logging.DEBUG)
- shell.operation_log.addHandler(log_handler)
-
-
-def _setup_handler_for_logging(handler_type, level, file_name, formatter):
- """Setup of the handler
-
- Setup of the handler for addition of the logging handler,
- changes of the logging format, change of the logging level,
-
- :param handler_type: type of logging handler
- :param level: logging level
- :param file_name: name of log-file
- :param formatter: instance of logging.Formatter
- :return: logging handler
- """
-
- root_logger = logging.getLogger('')
- handler = None
- # Setup handler for FileHandler(--os-cloud)
- handler = logging.FileHandler(
- filename=file_name,
- )
- handler.setFormatter(formatter)
- handler.setLevel(level)
-
- # If both `--log-file` and `--os-cloud` are specified,
- # the log is output to each file.
- root_logger.addHandler(handler)
-
- return handler
+class LogConfigurator(object):
+
+ _CONSOLE_MESSAGE_FORMAT = '%(message)s'
+
+ def __init__(self, options):
+ self.root_logger = logging.getLogger('')
+ self.root_logger.setLevel(logging.DEBUG)
+
+ # Force verbose_level 3 on --debug
+ self.dump_trace = False
+ if options.debug:
+ options.verbose_level = 3
+ self.dump_trace = True
+
+ # Always send higher-level messages to the console via stderr
+ self.console_logger = logging.StreamHandler(sys.stderr)
+ log_level = log_level_from_options(options)
+ self.console_logger.setLevel(log_level)
+ formatter = logging.Formatter(self._CONSOLE_MESSAGE_FORMAT)
+ self.console_logger.setFormatter(formatter)
+ self.root_logger.addHandler(self.console_logger)
+
+ # Set the warning filter now
+ set_warning_filter(log_level)
+
+ # Set up logging to a file
+ self.file_logger = None
+ log_file = options.log_file
+ if log_file:
+ self.file_logger = logging.FileHandler(filename=log_file)
+ self.file_logger.setFormatter(_FileFormatter(options=options))
+ self.file_logger.setLevel(log_level)
+ self.root_logger.addHandler(self.file_logger)
+
+ # Requests logs some stuff at INFO that we don't want
+ # unless we have DEBUG
+ requests_log = logging.getLogger("requests")
+
+ # Other modules we don't want DEBUG output for
+ cliff_log = logging.getLogger('cliff')
+ stevedore_log = logging.getLogger('stevedore')
+ iso8601_log = logging.getLogger("iso8601")
+
+ if options.debug:
+ # --debug forces traceback
+ requests_log.setLevel(logging.DEBUG)
+ else:
+ requests_log.setLevel(logging.ERROR)
+
+ cliff_log.setLevel(logging.ERROR)
+ stevedore_log.setLevel(logging.ERROR)
+ iso8601_log.setLevel(logging.ERROR)
+
+ def configure(self, cloud_config):
+ log_level = log_level_from_config(cloud_config.config)
+ set_warning_filter(log_level)
+ self.dump_trace = cloud_config.config.get('debug', self.dump_trace)
+ self.console_logger.setLevel(log_level)
+
+ log_file = cloud_config.config.get('log_file', None)
+ if log_file:
+ if not self.file_logger:
+ self.file_logger = logging.FileHandler(filename=log_file)
+ formatter = _FileFormatter(cloud_config=cloud_config)
+ self.file_logger.setFormatter(formatter)
+ self.file_logger.setFormatter(_FileFormatter(config=cloud_config))
+ self.file_logger.setLevel(log_level)
+ self.root_logger.addHandler(self.file_logger)