在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就好
其他的调用前、调用后等方式可以参照写出。
当然这只是简单地收集记录日志,实际生产中,一般并不选用这样的统一记录日志方法,因为这种方法不灵活,而且如果有其他监控系统的扭转是通过记录日志来的话,那就很尴尬了,会冲突影响到系统运行,所以理解为一种写法就好了,需要才使用!