This post is only a compilation from others posts that i read for create a log decorator.
Firstly, we need to configure a log properly, an good example can be found here
import logging
logger = logging.getLogger('decorator-log')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
Once log instance is configured, we create decorator using it.
import functools
class LogDecorator(object):
    def __init__(self):
        self.logger = logging.getLogger('decorator-log')
    def __call__(self, fn):
        @functools.wraps(fn)
        def decorated(*args, **kwargs):
            try:
                self.logger.debug("{0} - {1} - {2}".format(fn.__name__, args, kwargs))
                result = fn(*args, **kwargs)
                self.logger.debug(result)
                return result
            except Exception as ex:
                self.logger.debug("Exception {0}".format(ex))
                raise ex
            return result
        return decorated
It's almost done, we need to decorate some functions to test it:
## Start example
@LogDecorator()
def func(a, b, c):
    return a + b + c
@LogDecorator()
def crash(a,b):
    raise ValueError(str(a))
func(1,2,3)
try:
    crash(1,3)
except:
    pass
Our output will be:
2018-12-04 23:37:44,110 - decorator-log - DEBUG - func - (1, 2, 3) - {}
2018-12-04 23:37:44,110 - decorator-log - DEBUG - 6
2018-12-04 23:37:44,110 - decorator-log - DEBUG - crash - (1, 3) - {}
2018-12-04 23:37:44,110 - decorator-log - DEBUG - Exception 1
    
Top comments (0)