log_method: get logger from decorated method if unspecified

This commit makes 'log' optional.
'log' attribute of each command class does not exist
when the class is defined because 'log' is now setup
dynamically when a class is instantiated. Instead log_method
looks for a logger from a decorating method.

compute.v2.server is changed in this commit as an example.

Change-Id: Ic4d128f8e027d3b8e6f884f31369e9085c0f0871
Partial-Bug: #1532294
This commit is contained in:
Akihiro Motoki
2016-01-09 13:43:36 +09:00
parent 598061b63c
commit 85e6239a88

View File

@@ -26,28 +26,32 @@ from oslo_utils import importutils
from openstackclient.common import exceptions
def log_method(log, level=logging.DEBUG):
"""Logs a method and its arguments when entered."""
class log_method(object):
def decorator(func):
def __init__(self, log=None, level=logging.DEBUG):
self._log = log
self._level = level
def __call__(self, func):
func_name = func.__name__
if not self._log:
self._log = logging.getLogger(func.__class__.__name__)
@six.wraps(func)
def wrapper(self, *args, **kwargs):
if log.isEnabledFor(level):
def wrapper(*args, **kwargs):
if self._log.isEnabledFor(self._level):
pretty_args = []
if args:
pretty_args.extend(str(a) for a in args)
if kwargs:
pretty_args.extend(
"%s=%s" % (k, v) for k, v in six.iteritems(kwargs))
log.log(level, "%s(%s)", func_name, ", ".join(pretty_args))
return func(self, *args, **kwargs)
self._log.log(self._level, "%s(%s)",
func_name, ", ".join(pretty_args))
return func(*args, **kwargs)
return wrapper
return decorator
def find_resource(manager, name_or_id, **kwargs):
"""Helper for the _find_* methods.