125
126
return '%s.log' % (os.path.join(FLAGS.logdir, binary),)
129
logging.basicConfig()
130
for handler in logging.root.handlers:
131
handler.setFormatter(_formatter)
133
logging.root.setLevel(logging.DEBUG)
135
logging.root.setLevel(logging.INFO)
137
syslog = SysLogHandler(address='/dev/log')
138
syslog.setFormatter(_formatter)
139
logging.root.addHandler(syslog)
140
logpath = get_log_file_path()
142
logfile = WatchedFileHandler(logpath)
143
logfile.setFormatter(_formatter)
144
logging.root.addHandler(logfile)
147
129
class NovaLogger(logging.Logger):
149
131
NovaLogger manages request context and formatting.
151
133
This becomes the class that is instanciated by logging.getLogger.
153
135
def __init__(self, name, level=NOTSET):
154
level_name = self._get_level_from_flags(name, FLAGS)
155
level = globals()[level_name]
156
136
logging.Logger.__init__(self, name, level)
137
self.setup_from_flags()
158
def _get_level_from_flags(self, name, FLAGS):
159
# if exactly "nova", or a child logger, honor the verbose flag
160
if (name == "nova" or name.startswith("nova.")) and FLAGS.verbose:
139
def setup_from_flags(self):
140
"""Setup logger from flags"""
162
142
for pair in FLAGS.default_log_levels:
163
logger, _sep, level = pair.partition('=')
143
logger, _sep, level_name = pair.partition('=')
164
144
# NOTE(todd): if we set a.b, we want a.b.c to have the same level
165
145
# (but not a.bc, so we check the dot)
168
if name.startswith(logger) and name[len(logger)] == '.':
146
if self.name == logger or self.name.startswith("%s." % logger):
147
level = globals()[level_name]
172
150
def _log(self, level, msg, args, exc_info=None, extra=None, context=None):
173
151
"""Extract context from any log call"""
177
155
extra.update(_dictify_context(context))
178
156
extra.update({"nova_version": version.version_string_with_vcs()})
179
logging.Logger._log(self, level, msg, args, exc_info, extra)
157
return logging.Logger._log(self, level, msg, args, exc_info, extra)
181
159
def addHandler(self, handler):
182
160
"""Each handler gets our custom formatter"""
183
161
handler.setFormatter(_formatter)
184
logging.Logger.addHandler(self, handler)
162
return logging.Logger.addHandler(self, handler)
186
164
def audit(self, msg, *args, **kwargs):
187
165
"""Shortcut for our AUDIT level"""
208
186
self.error(message, **kwargs)
211
def handle_exception(type, value, tb):
212
logging.root.critical(str(value), exc_info=(type, value, tb))
215
sys.excepthook = handle_exception
216
logging.setLoggerClass(NovaLogger)
219
class NovaRootLogger(NovaLogger):
222
if not isinstance(logging.root, NovaRootLogger):
223
logging.root = NovaRootLogger("nova.root", WARNING)
224
NovaLogger.root = logging.root
225
NovaLogger.manager.root = logging.root
228
189
class NovaFormatter(logging.Formatter):
230
191
A nova.context.RequestContext aware formatter configured through flags.
271
232
_formatter = NovaFormatter()
235
class NovaRootLogger(NovaLogger):
236
def __init__(self, name, level=NOTSET):
239
self.syslog = SysLogHandler(address='/dev/log')
240
self.streamlog = StreamHandler()
241
NovaLogger.__init__(self, name, level)
243
def setup_from_flags(self):
244
"""Setup logger from flags"""
247
self.addHandler(self.syslog)
249
self.removeHandler(self.syslog)
250
logpath = _get_log_file_path()
252
self.removeHandler(self.streamlog)
253
if logpath != self.logpath:
254
self.removeHandler(self.filelog)
255
self.filelog = WatchedFileHandler(logpath)
256
self.addHandler(self.filelog)
257
self.logpath = logpath
259
self.removeHandler(self.filelog)
260
self.addHandler(self.streamlog)
267
def handle_exception(type, value, tb):
268
logging.root.critical(str(value), exc_info=(type, value, tb))
272
"""Resets logging handlers. Should be called if FLAGS changes."""
273
for logger in NovaLogger.manager.loggerDict.itervalues():
274
if isinstance(logger, NovaLogger):
275
logger.setup_from_flags()
279
"""Setup nova logging."""
280
if not isinstance(logging.root, NovaRootLogger):
281
logging._acquireLock()
282
for handler in logging.root.handlers:
283
logging.root.removeHandler(handler)
284
logging.root = NovaRootLogger("nova")
285
NovaLogger.root = logging.root
286
NovaLogger.manager.root = logging.root
287
for logger in NovaLogger.manager.loggerDict.itervalues():
288
logger.root = logging.root
289
if isinstance(logger, logging.Logger):
290
NovaLogger.manager._fixupParents(logger)
291
NovaLogger.manager.loggerDict["nova"] = logging.root
292
logging._releaseLock()
293
sys.excepthook = handle_exception
298
logging.setLoggerClass(NovaLogger)
274
301
def audit(msg, *args, **kwargs):
275
302
"""Shortcut for logging to root log with sevrity 'AUDIT'."""
276
if len(logging.root.handlers) == 0:
278
303
logging.root.log(AUDIT, msg, *args, **kwargs)