2017-01-15 16:36:01 +00:00
|
|
|
"""
|
|
|
|
Extra functionality for Flask logging
|
|
|
|
|
|
|
|
Flask-Logging-Extras is a Flask extension that plugs into the logging
|
|
|
|
mechanism of Flask applications.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
__version_info__ = ('0', '0', '1')
|
|
|
|
__version__ = '.'.join(__version_info__)
|
|
|
|
__author__ = 'Gergely Polonkai'
|
|
|
|
__license__ = 'BSD'
|
|
|
|
__copyright__ = '(c) 2015 GT2'
|
|
|
|
|
|
|
|
class FlaskExtraLogger(logging.getLoggerClass()):
|
|
|
|
"""
|
|
|
|
A logger class that is capable of adding extra keywords to log formatters
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
if 'app' in kwargs and kwargs['app'] is not None:
|
|
|
|
raise TypeError(
|
|
|
|
"Cannot initialise {classname} with an app. "
|
|
|
|
"See the documentation of Flask-Logging-Extras for more info."
|
|
|
|
.format(classname=self.__class__.__name__))
|
|
|
|
|
|
|
|
super(FlaskExtraLogger, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
def _log(self, *args, **kwargs):
|
|
|
|
if 'extra' not in kwargs:
|
|
|
|
kwargs['extra'] = {}
|
|
|
|
|
|
|
|
for kw in self._valid_keywords:
|
|
|
|
if kw in kwargs:
|
|
|
|
kwargs['extra'][kw] = kwargs[kw]
|
|
|
|
|
|
|
|
super(FlaskExtraLogger, self)._log(*args, **kwargs)
|
|
|
|
|
|
|
|
def init_app(self, app):
|
|
|
|
self.app = app
|
|
|
|
|
|
|
|
self.app.config.setdefault('FLASK_LOGGING_EXTRAS_KEYWORDS', [])
|
|
|
|
|
|
|
|
for kw in self.app.config['FLASK_LOGGING_EXTRAS_KEYWORDS']:
|
|
|
|
if kw in ['exc_info', 'extra', 'stack_info']:
|
|
|
|
raise ValueError(
|
|
|
|
'"{keyword}" member of FLASK_LOGGING_EXTRAS_KEYWORDS is '
|
|
|
|
'reserved for internal use.')
|
|
|
|
|
|
|
|
|
|
|
|
def register_logger_class(cls=FlaskExtraLogger):
|
|
|
|
"""
|
|
|
|
Register a new logger class
|
|
|
|
|
2017-01-16 07:28:26 +00:00
|
|
|
It is effectively a wrapper around logging.setLoggerClass(), with an
|
|
|
|
added check to make sure the class can be used as a logger.
|
|
|
|
|
|
|
|
To use the extra features of the logger class in a Flask app, you must
|
|
|
|
call it before the app is instantiated.
|
2017-01-15 16:36:01 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
if not issubclass(cls, logging.Logger):
|
|
|
|
raise TypeError(
|
|
|
|
"The logger class must be a subclass of logging.Logger!")
|
|
|
|
|
|
|
|
logging.setLoggerClass(cls)
|