python实现AOP日志记录

前言

在Java中,AOP编程是一件比较通用方法,能够少写很多重复性的代码,让程序自动帮我们完成,例如收集错误记录,保证业务的事务性,无措提交,有错回滚等。

最近写了较多python代码,在python中,使用print 记录日志,但是每一个方法都要写,比较麻烦,并且又不能记录跟踪到方法的执行流,所以就在想有没有一个切面的记录日志方法呢?

当然有!

例子

当然,java中是脚本编程的方式,可以定义一个函数:

    @log
    def do_exec(self, date, game_code=None):
        self.do_remove(date)
        pass

此时,当执行到这个do_exec方法时,就会有限执行log方法,类似的思想,可以根据不同的逻辑,在log中写不同的逻辑,例如方法

  • 调用前
  • 调用后
  • 环绕式
  • 或者捕获异常时候

当然以上几种思路一样的,接下来看环绕式的写法吧:


def log(func):
    @wraps(func)
    def log_proxy(*args):
        func_name = func.__name__
        aop_log(event='method_enter', time=pendulum.now('Asia/Shanghai'), method_name=func_name,
                  method_args=args)
        try:
            func(*args)
        except BaseException:   # 捕获所有exception
            exstr = traceback.format_exc()
            print(exstr)
        aop_log(event='method_exit', time=pendulum.now('Asia/Shanghai'), method_name=func_name,
                  method_args=args)
    return log_proxy               # 一定要返回自己的方法

如上,传入func作为参数,然后再func(*args)执行一次输出日志,在func(*args)输出日志,并且对于产生异常,也有统一的处理(可以自己改变)。
aop_log是一个单独的输出方法,为了适应不同平台下的日志输出,避免与外围系统产生冲突。理解为print就好

其他的调用前、调用后等方式可以参照写出。

写在后面

当然这只是简单地收集记录日志,实际生产中,一般并不选用这样的统一记录日志方法,因为这种方法不灵活,而且如果有其他监控系统的扭转是通过记录日志来的话,那就很尴尬了,会冲突影响到系统运行,所以理解为一种写法就好了,需要才使用!

你可能感兴趣的