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