普通文本  |  52行  |  1.53 KB

# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging


def log(method_to_log):
    """ A decorator method to log when 'decorated' methods have been executed.
     This greatly simplifies tracing of the method calls.

     To log execution of a method just decorate it with *log

     The decorator logs the method to be executed, its class, the arguments
     supplied to it and its return value.

     @param method_to_log: Method object that will be logged and invoked.

    """
    def log_wrapper(self, *args, **kwargs):
        """ Actual method doing the logging and also invokes method_to_log
        """

        log_str = '%s.%s' % (self.__class__.__name__, method_to_log.__name__)

        logging.debug('+ ' + log_str)

        have_args = len(args) > 0
        have_kwargs = len(kwargs) > 0

        if have_args:
            logging.debug('*** Begin arguments:')
            logging.debug(args)
            logging.debug('=== End arguments.')

        if have_kwargs:
            logging.debug('*** Begin keyword arguments:')
            logging.debug(kwargs)
            logging.debug('=== End keyword arguments.')

        result = method_to_log(self, *args, **kwargs)

        if result is not None:
            logging.debug('### Begin results :')
            logging.debug(result)
            logging.debug('--- End results.')

        logging.debug('- ' + log_str)

        return result

    return log_wrapper