summaryrefslogtreecommitdiffstats
path: root/openstack/common
diff options
context:
space:
mode:
authorDavanum Srinivas <dims@linux.vnet.ibm.com>2013-04-04 12:37:17 -0400
committerGerrit Code Review <review@openstack.org>2013-04-09 23:51:30 +0000
commit465e27158725b6b262e251247bc60edaeda2f54d (patch)
treeba566f5e248c7bf88b9900b379319e3a957e9a47 /openstack/common
parent9dcf688ea80f52cdb5413514198b2aa81d5a4e09 (diff)
downloadoslo-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.py36
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."""