Skip to content

Commit b95ce71

Browse files
committed
Allow custom log levels for other loggers
It would be convenient to be able to enable special logging for various components that openstack uses. The biggest thing is the --debug prints a lot of information when often all I want to see is the outgoing requests/responses. To get just that logged you would put this in your clouds.yaml: logging: keystoneclient.session: debug Closes-Bug: #1484660 Change-Id: I15c2607e8262f10903dd831ee8622fb5d6315310
1 parent 42b607e commit b95ce71

1 file changed

Lines changed: 37 additions & 9 deletions

File tree

openstackclient/common/logs.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
import warnings
1919

2020

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
26+
27+
2128
def log_level_from_options(options):
2229
# if --debug, --quiet or --verbose is not specified,
2330
# the default logging level is warning
@@ -34,6 +41,17 @@ def log_level_from_options(options):
3441
return log_level
3542

3643

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+
3755
def log_level_from_config(config):
3856
# Check the command line option
3957
verbose_level = config.get('verbose_level')
@@ -49,15 +67,7 @@ def log_level_from_config(config):
4967
verbose_level = 'info'
5068
else:
5169
verbose_level = 'debug'
52-
53-
log_level = {
54-
'critical': logging.CRITICAL,
55-
'error': logging.ERROR,
56-
'warning': logging.WARNING,
57-
'info': logging.INFO,
58-
'debug': logging.DEBUG,
59-
}.get(verbose_level, logging.WARNING)
60-
return log_level
70+
return log_level_from_string(verbose_level)
6171

6272

6373
def set_warning_filter(log_level):
@@ -168,3 +178,21 @@ def configure(self, cloud_config):
168178
self.file_logger.setFormatter(_FileFormatter(config=cloud_config))
169179
self.file_logger.setLevel(log_level)
170180
self.root_logger.addHandler(self.file_logger)
181+
182+
logconfig = cloud_config.config.get('logging', None)
183+
if logconfig:
184+
highest_level = logging.NOTSET
185+
for k in logconfig.keys():
186+
level = log_level_from_string(logconfig[k])
187+
logging.getLogger(k).setLevel(level)
188+
if (highest_level < level):
189+
highest_level = level
190+
self.console_logger.setLevel(highest_level)
191+
if self.file_logger:
192+
self.file_logger.setLevel(highest_level)
193+
# loggers that are not set will use the handler level, so we
194+
# need to set the global level for all the loggers
195+
for logkey in logging.Logger.manager.loggerDict.keys():
196+
logger = logging.getLogger(logkey)
197+
if logger.level == logging.NOTSET:
198+
logger.setLevel(log_level)

0 commit comments

Comments
 (0)