1*9c5db199SXin Li# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Liimport logging 6*9c5db199SXin Li 7*9c5db199SXin Li 8*9c5db199SXin Lidef log(method_to_log): 9*9c5db199SXin Li """ A decorator method to log when 'decorated' methods have been executed. 10*9c5db199SXin Li This greatly simplifies tracing of the method calls. 11*9c5db199SXin Li 12*9c5db199SXin Li To log execution of a method just decorate it with *log 13*9c5db199SXin Li 14*9c5db199SXin Li The decorator logs the method to be executed, its class, the arguments 15*9c5db199SXin Li supplied to it and its return value. 16*9c5db199SXin Li 17*9c5db199SXin Li @param method_to_log: Method object that will be logged and invoked. 18*9c5db199SXin Li 19*9c5db199SXin Li """ 20*9c5db199SXin Li def log_wrapper(self, *args, **kwargs): 21*9c5db199SXin Li """ Actual method doing the logging and also invokes method_to_log 22*9c5db199SXin Li """ 23*9c5db199SXin Li 24*9c5db199SXin Li log_str = '%s.%s' % (self.__class__.__name__, method_to_log.__name__) 25*9c5db199SXin Li 26*9c5db199SXin Li logging.debug('+ ' + log_str) 27*9c5db199SXin Li 28*9c5db199SXin Li have_args = len(args) > 0 29*9c5db199SXin Li have_kwargs = len(kwargs) > 0 30*9c5db199SXin Li 31*9c5db199SXin Li if have_args: 32*9c5db199SXin Li logging.debug('*** Begin arguments:') 33*9c5db199SXin Li logging.debug(args) 34*9c5db199SXin Li logging.debug('=== End arguments.') 35*9c5db199SXin Li 36*9c5db199SXin Li if have_kwargs: 37*9c5db199SXin Li logging.debug('*** Begin keyword arguments:') 38*9c5db199SXin Li logging.debug(kwargs) 39*9c5db199SXin Li logging.debug('=== End keyword arguments.') 40*9c5db199SXin Li 41*9c5db199SXin Li result = method_to_log(self, *args, **kwargs) 42*9c5db199SXin Li 43*9c5db199SXin Li if result is not None: 44*9c5db199SXin Li logging.debug('### Begin results :') 45*9c5db199SXin Li logging.debug(result) 46*9c5db199SXin Li logging.debug('--- End results.') 47*9c5db199SXin Li 48*9c5db199SXin Li logging.debug('- ' + log_str) 49*9c5db199SXin Li 50*9c5db199SXin Li return result 51*9c5db199SXin Li 52*9c5db199SXin Li return log_wrapper