|
11 | 11 | # under the License. |
12 | 12 | # |
13 | 13 |
|
14 | | -"""Application logging""" |
| 14 | +# NOTE(dtroyer): This file is deprecated in Jun 2016, remove after 4.x release |
| 15 | +# or Jun 2017. |
15 | 16 |
|
16 | | -import logging |
17 | 17 | import sys |
18 | | -import warnings |
19 | 18 |
|
| 19 | +from osc_lib.logs import * # noqa |
| 20 | +from osc_lib.logs import _FileFormatter # noqa |
20 | 21 |
|
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 | 22 |
|
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 | +) |
0 commit comments