Skip to content

Commit 59dffb9

Browse files
author
Dean Troyer
committed
osc-lib: logs
Change-Id: I2a4d40cd72cc22e97a600751ae29c2309ebed28b
1 parent e5e29a8 commit 59dffb9

4 files changed

Lines changed: 19 additions & 186 deletions

File tree

doc/source/plugins.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,12 @@ the plugin commands:
153153
154154
# osc-lib interfaces available to plugins:
155155
from osc_lib import exceptions
156+
from osc_lib import logs
156157
from osc_lib import utils
157158
158159
# OSC common interfaces available to plugins:
159160
from openstackclient.common import command
160161
from openstackclient.common import parseractions
161-
from openstackclient.common import logs
162162
163163
164164
class DeleteMypluginobject(command.Command):

openstackclient/common/logs.py

Lines changed: 8 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -11,186 +11,16 @@
1111
# under the License.
1212
#
1313

14-
"""Application logging"""
14+
# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release
15+
# or Jun 2017.
1516

16-
import logging
1717
import sys
18-
import warnings
1918

19+
from osc_lib.logs import * # noqa
20+
from osc_lib.logs import _FileFormatter # noqa
2021

21-
def get_loggers():
22-
loggers = {}
23-
for logkey in logging.Logger.manager.loggerDict.keys():
24-
loggers[logkey] = logging.getLevelName(logging.getLogger(logkey).level)
25-
return loggers
2622

27-
28-
def log_level_from_options(options):
29-
# if --debug, --quiet or --verbose is not specified,
30-
# the default logging level is warning
31-
log_level = logging.WARNING
32-
if options.verbose_level == 0:
33-
# --quiet
34-
log_level = logging.ERROR
35-
elif options.verbose_level == 2:
36-
# One --verbose
37-
log_level = logging.INFO
38-
elif options.verbose_level >= 3:
39-
# Two or more --verbose
40-
log_level = logging.DEBUG
41-
return log_level
42-
43-
44-
def log_level_from_string(level_string):
45-
log_level = {
46-
'critical': logging.CRITICAL,
47-
'error': logging.ERROR,
48-
'warning': logging.WARNING,
49-
'info': logging.INFO,
50-
'debug': logging.DEBUG,
51-
}.get(level_string, logging.WARNING)
52-
return log_level
53-
54-
55-
def log_level_from_config(config):
56-
# Check the command line option
57-
verbose_level = config.get('verbose_level')
58-
if config.get('debug', False):
59-
verbose_level = 3
60-
if verbose_level == 0:
61-
verbose_level = 'error'
62-
elif verbose_level == 1:
63-
# If a command line option has not been specified, check the
64-
# configuration file
65-
verbose_level = config.get('log_level', 'warning')
66-
elif verbose_level == 2:
67-
verbose_level = 'info'
68-
else:
69-
verbose_level = 'debug'
70-
return log_level_from_string(verbose_level)
71-
72-
73-
def set_warning_filter(log_level):
74-
if log_level == logging.ERROR:
75-
warnings.simplefilter("ignore")
76-
elif log_level == logging.WARNING:
77-
warnings.simplefilter("ignore")
78-
elif log_level == logging.INFO:
79-
warnings.simplefilter("once")
80-
81-
82-
class _FileFormatter(logging.Formatter):
83-
"""Customize the logging format for logging handler"""
84-
_LOG_MESSAGE_BEGIN = (
85-
'%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s ')
86-
_LOG_MESSAGE_CONTEXT = '[%(cloud)s %(username)s %(project)s] '
87-
_LOG_MESSAGE_END = '%(message)s'
88-
_LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
89-
90-
def __init__(self, options=None, config=None, **kwargs):
91-
context = {}
92-
if options:
93-
context = {
94-
'cloud': getattr(options, 'cloud', ''),
95-
'project': getattr(options, 'os_project_name', ''),
96-
'username': getattr(options, 'username', ''),
97-
}
98-
elif config:
99-
context = {
100-
'cloud': config.config.get('cloud', ''),
101-
'project': config.auth.get('project_name', ''),
102-
'username': config.auth.get('username', ''),
103-
}
104-
if context:
105-
self.fmt = (self._LOG_MESSAGE_BEGIN +
106-
(self._LOG_MESSAGE_CONTEXT % context) +
107-
self._LOG_MESSAGE_END)
108-
else:
109-
self.fmt = self._LOG_MESSAGE_BEGIN + self._LOG_MESSAGE_END
110-
logging.Formatter.__init__(self, self.fmt, self._LOG_DATE_FORMAT)
111-
112-
113-
class LogConfigurator(object):
114-
115-
_CONSOLE_MESSAGE_FORMAT = '%(message)s'
116-
117-
def __init__(self, options):
118-
self.root_logger = logging.getLogger('')
119-
self.root_logger.setLevel(logging.DEBUG)
120-
121-
# Force verbose_level 3 on --debug
122-
self.dump_trace = False
123-
if options.debug:
124-
options.verbose_level = 3
125-
self.dump_trace = True
126-
127-
# Always send higher-level messages to the console via stderr
128-
self.console_logger = logging.StreamHandler(sys.stderr)
129-
log_level = log_level_from_options(options)
130-
self.console_logger.setLevel(log_level)
131-
formatter = logging.Formatter(self._CONSOLE_MESSAGE_FORMAT)
132-
self.console_logger.setFormatter(formatter)
133-
self.root_logger.addHandler(self.console_logger)
134-
135-
# Set the warning filter now
136-
set_warning_filter(log_level)
137-
138-
# Set up logging to a file
139-
self.file_logger = None
140-
log_file = options.log_file
141-
if log_file:
142-
self.file_logger = logging.FileHandler(filename=log_file)
143-
self.file_logger.setFormatter(_FileFormatter(options=options))
144-
self.file_logger.setLevel(log_level)
145-
self.root_logger.addHandler(self.file_logger)
146-
147-
# Requests logs some stuff at INFO that we don't want
148-
# unless we have DEBUG
149-
requests_log = logging.getLogger("requests")
150-
151-
# Other modules we don't want DEBUG output for
152-
cliff_log = logging.getLogger('cliff')
153-
stevedore_log = logging.getLogger('stevedore')
154-
iso8601_log = logging.getLogger("iso8601")
155-
156-
if options.debug:
157-
# --debug forces traceback
158-
requests_log.setLevel(logging.DEBUG)
159-
else:
160-
requests_log.setLevel(logging.ERROR)
161-
162-
cliff_log.setLevel(logging.ERROR)
163-
stevedore_log.setLevel(logging.ERROR)
164-
iso8601_log.setLevel(logging.ERROR)
165-
166-
def configure(self, cloud_config):
167-
log_level = log_level_from_config(cloud_config.config)
168-
set_warning_filter(log_level)
169-
self.dump_trace = cloud_config.config.get('debug', self.dump_trace)
170-
self.console_logger.setLevel(log_level)
171-
172-
log_file = cloud_config.config.get('log_file')
173-
if log_file:
174-
if not self.file_logger:
175-
self.file_logger = logging.FileHandler(filename=log_file)
176-
self.file_logger.setFormatter(_FileFormatter(config=cloud_config))
177-
self.file_logger.setLevel(log_level)
178-
self.root_logger.addHandler(self.file_logger)
179-
180-
logconfig = cloud_config.config.get('logging')
181-
if logconfig:
182-
highest_level = logging.NOTSET
183-
for k in logconfig.keys():
184-
level = log_level_from_string(logconfig[k])
185-
logging.getLogger(k).setLevel(level)
186-
if (highest_level < level):
187-
highest_level = level
188-
self.console_logger.setLevel(highest_level)
189-
if self.file_logger:
190-
self.file_logger.setLevel(highest_level)
191-
# loggers that are not set will use the handler level, so we
192-
# need to set the global level for all the loggers
193-
for logkey in logging.Logger.manager.loggerDict.keys():
194-
logger = logging.getLogger(logkey)
195-
if logger.level == logging.NOTSET:
196-
logger.setLevel(log_level)
23+
sys.stderr.write(
24+
"WARNING: %s is deprecated and will be removed after Jun 2017. "
25+
"Please use osc_lib.logs\n" % __name__
26+
)

openstackclient/shell.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
from cliff import complete
2828
from cliff import help
2929
from osc_lib import exceptions as exc
30+
from osc_lib import logs
3031
from osc_lib import utils
3132
from oslo_utils import importutils
3233
from oslo_utils import strutils
3334

3435
import openstackclient
3536
from openstackclient.common import clientmanager
3637
from openstackclient.common import commandmanager
37-
from openstackclient.common import logs
3838
from openstackclient.common import timing
3939

4040
from os_client_config import config as cloud_config

openstackclient/tests/common/test_logs.py

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

14+
# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release
15+
# or Jun 2017.
16+
1417
import logging
1518
import mock
1619

@@ -121,7 +124,7 @@ def setUp(self):
121124

122125
@mock.patch('logging.StreamHandler')
123126
@mock.patch('logging.getLogger')
124-
@mock.patch('openstackclient.common.logs.set_warning_filter')
127+
@mock.patch('osc_lib.logs.set_warning_filter')
125128
def test_init(self, warning_filter, getLogger, handle):
126129
getLogger.side_effect = self.loggers
127130
console_logger = mock.Mock()
@@ -142,7 +145,7 @@ def test_init(self, warning_filter, getLogger, handle):
142145
self.assertFalse(configurator.dump_trace)
143146

144147
@mock.patch('logging.getLogger')
145-
@mock.patch('openstackclient.common.logs.set_warning_filter')
148+
@mock.patch('osc_lib.logs.set_warning_filter')
146149
def test_init_no_debug(self, warning_filter, getLogger):
147150
getLogger.side_effect = self.loggers
148151
self.options.debug = True
@@ -155,8 +158,8 @@ def test_init_no_debug(self, warning_filter, getLogger):
155158

156159
@mock.patch('logging.FileHandler')
157160
@mock.patch('logging.getLogger')
158-
@mock.patch('openstackclient.common.logs.set_warning_filter')
159-
@mock.patch('openstackclient.common.logs._FileFormatter')
161+
@mock.patch('osc_lib.logs.set_warning_filter')
162+
@mock.patch('osc_lib.logs._FileFormatter')
160163
def test_init_log_file(self, formatter, warning_filter, getLogger, handle):
161164
getLogger.side_effect = self.loggers
162165
self.options.log_file = '/tmp/log_file'
@@ -176,8 +179,8 @@ def test_init_log_file(self, formatter, warning_filter, getLogger, handle):
176179

177180
@mock.patch('logging.FileHandler')
178181
@mock.patch('logging.getLogger')
179-
@mock.patch('openstackclient.common.logs.set_warning_filter')
180-
@mock.patch('openstackclient.common.logs._FileFormatter')
182+
@mock.patch('osc_lib.logs.set_warning_filter')
183+
@mock.patch('osc_lib.logs._FileFormatter')
181184
def test_configure(self, formatter, warning_filter, getLogger, handle):
182185
getLogger.side_effect = self.loggers
183186
configurator = logs.LogConfigurator(self.options)

0 commit comments

Comments
 (0)