之前有一个记录监控日志的业务,一直困扰了我很久,主要原因是在并发过程中,记录的日志发生了错误数据。
场景:
在aop中统一进行日志的记录,访问每个接口都会进入该aop的方法中,同时实现了一个日志工具类,日志工具类中有个参数是用来记录当前调用接口的名称,原本这个参数全部都通过构造器来进行传入,但是为了避免过多的存储相同的信息,我希望可以只调用一次存储接口,剩余的生成日志的方法中就都可以进行使用该接口名称。但是这样做的话会有一个问题,那就是当两个线程同时访问的时候,如果一个线程已经先增加了一个接口名称,第二个线程随后进入,也增加了一个接口名称,由于这个对象是单例的,所以堆中的值已经发生了改变,这时候,第一个线程调用打印日志的接口,使用的接口名称却是第二个线程修改后的名称,从而造成了脏数据。
解决:
尝试了一些办法,比如将名称设置放入到各个接口中,或者将接口名称放入到自定义的异常当中,但是这也会出现新的问题,那就是系统异常没有办法进行设置,等。
其实这个就是自己挖了个坑,然后自己绕进去出不来了,在aop中,我完全可以先把接口名称保存到变量中,然后再打印日志时,再将变量中的接口名称传入日志的单例对象中,这样就不会对日志造成脏数据。