diff options
| author | Davanum Srinivas <dims@linux.vnet.ibm.com> | 2013-04-04 12:37:17 -0400 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-04-09 23:51:30 +0000 |
| commit | 465e27158725b6b262e251247bc60edaeda2f54d (patch) | |
| tree | ba566f5e248c7bf88b9900b379319e3a957e9a47 /openstack/common | |
| parent | 9dcf688ea80f52cdb5413514198b2aa81d5a4e09 (diff) | |
| download | oslo-465e27158725b6b262e251247bc60edaeda2f54d.tar.gz oslo-465e27158725b6b262e251247bc60edaeda2f54d.tar.xz oslo-465e27158725b6b262e251247bc60edaeda2f54d.zip | |
Support for lazily instantiated loggers
As part of code review for LP #1161031, there was a suggestion
to lazily instantiate the logger in oslo. The use case was when
creating LOG at a module level when we have not yet called
logging.setup, we needed a way to delay creating actual loggers
Added a handlers property in ContextAdapter so the existing testcase
can be used for lazy loggers as well
Change-Id: Iae2e379f8a0d2d38836645e7648294dee97deaaa
Diffstat (limited to 'openstack/common')
| -rw-r--r-- | openstack/common/log.py | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/openstack/common/log.py b/openstack/common/log.py index 8f4db7c..31f35a5 100644 --- a/openstack/common/log.py +++ b/openstack/common/log.py @@ -211,7 +211,27 @@ def _get_log_file_path(binary=None): return '%s.log' % (os.path.join(logdir, binary),) -class ContextAdapter(logging.LoggerAdapter): +class BaseLoggerAdapter(logging.LoggerAdapter): + + def audit(self, msg, *args, **kwargs): + self.log(logging.AUDIT, msg, *args, **kwargs) + + +class LazyAdapter(BaseLoggerAdapter): + def __init__(self, name='unknown', version='unknown'): + self._logger = None + self.extra = {} + self.name = name + self.version = version + + @property + def logger(self): + if not self._logger: + self._logger = getLogger(self.name, self.version) + return self._logger + + +class ContextAdapter(BaseLoggerAdapter): warn = logging.LoggerAdapter.warning def __init__(self, logger, project_name, version_string): @@ -219,8 +239,9 @@ class ContextAdapter(logging.LoggerAdapter): self.project = project_name self.version = version_string - def audit(self, msg, *args, **kwargs): - self.log(logging.AUDIT, msg, *args, **kwargs) + @property + def handlers(self): + return self.logger.handlers def deprecated(self, msg, *args, **kwargs): stdmsg = _("Deprecated: %s") % msg @@ -452,6 +473,15 @@ def getLogger(name='unknown', version='unknown'): return _loggers[name] +def getLazyLogger(name='unknown', version='unknown'): + """ + create a pass-through logger that does not create the real logger + until it is really needed and delegates all calls to the real logger + once it is created + """ + return LazyAdapter(name, version) + + class WritableLogger(object): """A thin wrapper that responds to `write` and logs.""" |
