python 日志 装饰器_Python:创建异常日志装饰器

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值