|
11 | 11 | # under the License. |
12 | 12 | # |
13 | 13 |
|
14 | | -"""Context and Formatter""" |
| 14 | +"""Application logging""" |
15 | 15 |
|
16 | 16 | import logging |
| 17 | +import sys |
17 | 18 | import warnings |
18 | 19 |
|
19 | 20 |
|
@@ -99,76 +100,71 @@ def __init__(self, options=None, config=None, **kwargs): |
99 | 100 | logging.Formatter.__init__(self, self.fmt, self._LOG_DATE_FORMAT) |
100 | 101 |
|
101 | 102 |
|
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) |
0 commit comments