Skip to content

Commit 85a0394

Browse files
committed
Create log configuration class
Configuration of logging gets triggered twice. The first time it uses the CLI options when the application is started and second it uses the configuration file after that is read. The state of the logging needs to be saved from the first to the second time, so I created a class. Implements: blueprint logging-migration Change-Id: I7b8d1a3b6fd128e98cafd7c16009c7b694a52146
1 parent 6c46355 commit 85a0394

4 files changed

Lines changed: 189 additions & 262 deletions

File tree

openstackclient/common/context.py

Lines changed: 70 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
# under the License.
1212
#
1313

14-
"""Context and Formatter"""
14+
"""Application logging"""
1515

1616
import logging
17+
import sys
1718
import warnings
1819

1920

@@ -99,76 +100,71 @@ def __init__(self, options=None, config=None, **kwargs):
99100
logging.Formatter.__init__(self, self.fmt, self._LOG_DATE_FORMAT)
100101

101102

102-
def setup_handler_logging_level(handler_type, level):
103-
"""Setup of the handler for set the logging level
104-
105-
:param handler_type: type of logging handler
106-
:param level: logging level
107-
:return: None
108-
"""
109-
# Set the handler logging level of FileHandler(--log-file)
110-
# and StreamHandler
111-
for h in logging.getLogger('').handlers:
112-
if type(h) is handler_type:
113-
h.setLevel(level)
114-
115-
116-
def setup_logging(shell, cloud_config):
117-
"""Get one cloud configuration from configuration file and setup logging
118-
119-
:param shell: instance of openstackclient shell
120-
:param cloud_config:
121-
instance of the cloud specified by --os-cloud
122-
in the configuration file
123-
:return: None
124-
"""
125-
126-
log_level = log_level_from_config(cloud_config.config)
127-
set_warning_filter(log_level)
128-
129-
log_file = cloud_config.config.get('log_file', None)
130-
if log_file:
131-
# setup the logging context
132-
formatter = _FileFormatter(config=cloud_config)
133-
# setup the logging handler
134-
log_handler = _setup_handler_for_logging(
135-
logging.FileHandler,
136-
log_level,
137-
file_name=log_file,
138-
formatter=formatter,
139-
)
140-
if log_level == logging.DEBUG:
141-
# DEBUG only.
142-
# setup the operation_log
143-
shell.enable_operation_logging = True
144-
shell.operation_log.setLevel(logging.DEBUG)
145-
shell.operation_log.addHandler(log_handler)
146-
147-
148-
def _setup_handler_for_logging(handler_type, level, file_name, formatter):
149-
"""Setup of the handler
150-
151-
Setup of the handler for addition of the logging handler,
152-
changes of the logging format, change of the logging level,
153-
154-
:param handler_type: type of logging handler
155-
:param level: logging level
156-
:param file_name: name of log-file
157-
:param formatter: instance of logging.Formatter
158-
:return: logging handler
159-
"""
160-
161-
root_logger = logging.getLogger('')
162-
handler = None
163-
# Setup handler for FileHandler(--os-cloud)
164-
handler = logging.FileHandler(
165-
filename=file_name,
166-
)
167-
handler.setFormatter(formatter)
168-
handler.setLevel(level)
169-
170-
# If both `--log-file` and `--os-cloud` are specified,
171-
# the log is output to each file.
172-
root_logger.addHandler(handler)
173-
174-
return handler
103+
class LogConfigurator(object):
104+
105+
_CONSOLE_MESSAGE_FORMAT = '%(message)s'
106+
107+
def __init__(self, options):
108+
self.root_logger = logging.getLogger('')
109+
self.root_logger.setLevel(logging.DEBUG)
110+
111+
# Force verbose_level 3 on --debug
112+
self.dump_trace = False
113+
if options.debug:
114+
options.verbose_level = 3
115+
self.dump_trace = True
116+
117+
# Always send higher-level messages to the console via stderr
118+
self.console_logger = logging.StreamHandler(sys.stderr)
119+
log_level = log_level_from_options(options)
120+
self.console_logger.setLevel(log_level)
121+
formatter = logging.Formatter(self._CONSOLE_MESSAGE_FORMAT)
122+
self.console_logger.setFormatter(formatter)
123+
self.root_logger.addHandler(self.console_logger)
124+
125+
# Set the warning filter now
126+
set_warning_filter(log_level)
127+
128+
# Set up logging to a file
129+
self.file_logger = None
130+
log_file = options.log_file
131+
if log_file:
132+
self.file_logger = logging.FileHandler(filename=log_file)
133+
self.file_logger.setFormatter(_FileFormatter(options=options))
134+
self.file_logger.setLevel(log_level)
135+
self.root_logger.addHandler(self.file_logger)
136+
137+
# Requests logs some stuff at INFO that we don't want
138+
# unless we have DEBUG
139+
requests_log = logging.getLogger("requests")
140+
141+
# Other modules we don't want DEBUG output for
142+
cliff_log = logging.getLogger('cliff')
143+
stevedore_log = logging.getLogger('stevedore')
144+
iso8601_log = logging.getLogger("iso8601")
145+
146+
if options.debug:
147+
# --debug forces traceback
148+
requests_log.setLevel(logging.DEBUG)
149+
else:
150+
requests_log.setLevel(logging.ERROR)
151+
152+
cliff_log.setLevel(logging.ERROR)
153+
stevedore_log.setLevel(logging.ERROR)
154+
iso8601_log.setLevel(logging.ERROR)
155+
156+
def configure(self, cloud_config):
157+
log_level = log_level_from_config(cloud_config.config)
158+
set_warning_filter(log_level)
159+
self.dump_trace = cloud_config.config.get('debug', self.dump_trace)
160+
self.console_logger.setLevel(log_level)
161+
162+
log_file = cloud_config.config.get('log_file', None)
163+
if log_file:
164+
if not self.file_logger:
165+
self.file_logger = logging.FileHandler(filename=log_file)
166+
formatter = _FileFormatter(cloud_config=cloud_config)
167+
self.file_logger.setFormatter(formatter)
168+
self.file_logger.setFormatter(_FileFormatter(config=cloud_config))
169+
self.file_logger.setLevel(log_level)
170+
self.root_logger.addHandler(self.file_logger)

openstackclient/shell.py

Lines changed: 5 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -94,60 +94,12 @@ def __init__(self):
9494
self.verify = True
9595

9696
self.client_manager = None
97-
98-
# Operation log
99-
self.enable_operation_logging = False
10097
self.command_options = None
10198

10299
def configure_logging(self):
103-
"""Configure logging for the app
104-
105-
Cliff sets some defaults we don't want so re-work it a bit
106-
"""
107-
108-
if self.options.debug:
109-
# --debug forces verbose_level 3
110-
# Set this here so cliff.app.configure_logging() can work
111-
self.options.verbose_level = 3
112-
113-
super(OpenStackShell, self).configure_logging()
114-
115-
# Set logging to the requested level
116-
log_level = context.log_level_from_options(self.options)
117-
context.set_warning_filter(log_level)
118-
119-
# Set the handler logging level of FileHandler(--log-file)
120-
# and StreamHandler
121-
if self.options.log_file:
122-
context.setup_handler_logging_level(logging.FileHandler, log_level)
123-
124-
context.setup_handler_logging_level(logging.StreamHandler, log_level)
125-
126-
# Requests logs some stuff at INFO that we don't want
127-
# unless we have DEBUG
128-
requests_log = logging.getLogger("requests")
129-
130-
# Other modules we don't want DEBUG output for
131-
cliff_log = logging.getLogger('cliff')
132-
stevedore_log = logging.getLogger('stevedore')
133-
iso8601_log = logging.getLogger("iso8601")
134-
135-
if self.options.debug:
136-
# --debug forces traceback
137-
self.dump_stack_trace = True
138-
requests_log.setLevel(logging.DEBUG)
139-
else:
140-
self.dump_stack_trace = False
141-
requests_log.setLevel(logging.ERROR)
142-
143-
cliff_log.setLevel(logging.ERROR)
144-
stevedore_log.setLevel(logging.ERROR)
145-
iso8601_log.setLevel(logging.ERROR)
146-
147-
# Operation logging
148-
self.operation_log = logging.getLogger("operation_log")
149-
self.operation_log.setLevel(logging.ERROR)
150-
self.operation_log.propagate = False
100+
"""Configure logging for the app."""
101+
self.log_configurator = context.LogConfigurator(self.options)
102+
self.dump_stack_trace = self.log_configurator.dump_trace
151103

152104
def run(self, argv):
153105
ret_val = 1
@@ -162,8 +114,6 @@ def run(self, argv):
162114
self.log.error(traceback.format_exc(e))
163115
else:
164116
self.log.error('Exception raised: ' + str(e))
165-
if self.enable_operation_logging:
166-
self.operation_log.error(traceback.format_exc(e))
167117

168118
return ret_val
169119

@@ -287,9 +237,8 @@ def initialize_app(self, argv):
287237
argparse=self.options,
288238
)
289239

290-
# Set up every time record log in file and logging start
291-
context.setup_logging(self, self.cloud)
292-
240+
self.log_configurator.configure(self.cloud)
241+
self.dump_stack_trace = self.log_configurator.dump_trace
293242
self.log.info("START with options: %s", self.command_options)
294243
self.log.debug("options: %s", self.options)
295244
self.log.debug("defaults: %s", cc.defaults)

0 commit comments

Comments
 (0)