摘要:第一个函数创建了日志对象并返回该日志对象。第二个函数是我们的装饰器函数。我们在一个中封装传递的函数,当中发生任何异常的时候,进行日志记录。
Python: How to Create an Exception Logging Decorator
exception_decor.py
import functools import logging def create_logger(): """ Creates a logging object and returns it """ logger = logging.getLogger("example_logger") logger.setLevel(logging.INFO) # create the logging file handler fh = logging.FileHandler("/path/to/test.log") fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" formatter = logging.Formatter(fmt) fh.setFormatter(formatter) # add handler to logger object logger.addHandler(fh) return logger def exception(function): """ A decorator that wraps the passed in function and logs exceptions should one occur """ @functools.wraps(function) def wrapper(*args, **kwargs): logger = create_logger() try: return function(*args, **kwargs) except: # log the exception err = "There was an exception in " err += function.__name__ logger.exception(err) # re-raise the exception raise return wrapper
在该代码中,有两个函数。第一个函数创建了日志对象并返回该日志对象。第二个函数是我们的装饰器函数。我们在一个try/except中封装传递的函数,当logger中发生任何异常的时候,进行日志记录。并且我还记录了当异常发生时的函数名称。
现在让我们测试下该装饰器。
from exception_decor import exception @exception def zero_divide(): 1 / 0 if __name__ == "__main__": zero_divide()
运行以上测试代码后,会出现以下错误日志:
2016-06-09 08:26:50,874 - example_logger - ERROR - There was an exception in zero_divide Traceback (most recent call last): File "/home/mike/exception_decor.py", line 29, in wrapper return function(*args, **kwargs) File "/home/mike/test_exceptions.py", line 5, in zero_divide 1 / 0 ZeroDivisionError: integer division or modulo by zero传递一个 logger 到装饰器
# exception_logger.py import logging def create_logger(): """ Creates a logging object and returns it """ logger = logging.getLogger("example_logger") logger.setLevel(logging.INFO) # create the logging file handler fh = logging.FileHandler(r"/path/to/test.log") fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" formatter = logging.Formatter(fmt) fh.setFormatter(formatter) # add handler to logger object logger.addHandler(fh) return logger logger = create_logger()
现在修改前面出现的装饰器,以便可以接受 logger 作为参数。
# exception_decor.py import functools def exception(logger): """ A decorator that wraps the passed in function and logs exceptions should one occur @param logger: The logging object """ def decorator(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
最后修改测试脚本:
from exception_decor import exception from exception_logger import logger @exception(logger) def zero_divide(): 1 / 0 if __name__ == "__main__": zero_divide()
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/37996.html
摘要:内置函数实现对可迭代对象进行进一步处理。文件文件的打开权限打开文件,文件不存在报异常写入文件,文件不存在则创建。文件不存在则创建。追加文件,具有读写权限。 Python基础类型: 1.Tuple元组,内容不可改变,但是允许元素内部存在list等类型的元素,并且允许改变列表的值,所谓内容不可变指的是在内存中指向的地址是不变的。 temp=(1,2,[3,4]) temp[-1]....
摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...
阅读 3071·2021-09-28 09:43
阅读 904·2021-09-08 09:35
阅读 1443·2019-08-30 15:56
阅读 1186·2019-08-30 13:00
阅读 2732·2019-08-29 18:35
阅读 1832·2019-08-29 14:07
阅读 3435·2019-08-29 13:13
阅读 1334·2019-08-29 12:40