Skip to content

Commit 46696f5

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Create log configuration class"
2 parents cd54db8 + 85a0394 commit 46696f5

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)