先搞个log_decorator.py里面2个函数,简单说明一下_logger()是封装logger的、exception_logger()是抛出logger的异常的装饰器
log_decorator.py
import logging
import functools
def _logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
fh = logging.StreamHandler()
#fh = logging.FileHandler("exception.log")
fmt = "[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s] - %(message)s"
formatter = logging.Formatter(fmt)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
def exception_logger(logger):
"""
A decorator that wraps the passed in function and logs
exceptions should one occur
@param logger: The logging object
"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
# log the exception
err = "There was an exception in "
err += func.__name__
logger.exception(err)
# re-raise the exception
raise
return wrapper
return decorator
guns.py
from log_decorator import _logger, exception_logger
logger = _logger()
@exception_logger(logger)
def main():
logger.info('不能太好用!')
这样我们的main()函数就使用了装饰器@exception_logger当main函数出现异常的时候会抛出异常到装饰器,且我们可使用封装好的logger打印日志简单便捷还高级