如果处理日志和业务逻辑成为目前解耦的一个难题。在项目中,往往会发现书写日志的代码往往会大于真正的业务逻辑代码,造成代码阅读上的困难。然而,把日志从应用逻辑中分离出去却有非常困难。
当前,流行的分离日志和业务逻辑的方法是使用AOP,从另一个角度来说,也是AOP应用较多的领域之一。但是,使用AOP进行日志分离也有着严重的问题。当前AOP主要分为Spring的无内浸性AOP,以及AspectJ的内侵式AOP。使用AspectJ,需要专门的AspectJ编译器,这个让很多JAVA程序员无法接受。使用Spring的AOP的话,由于Spring的AOP是基于JAVA的动态代理功能上构建的,只能在方法的前后进行AOP插入,限制了其应用的范围,尤其是对于日志信息来说,仅仅在方法调用前后记录日志,肯定是不够的。
因此,当前情况下,如果不使用AspectJ,要把日志代码全部分离出去,不太现实。
如果AOP的方法暂时不可行,那么,换一个角度来说,我们不把日志信息与逻辑代码相分离,那么日志信息应该写在什么地方。以OO的角度来看,数据进行封装,不应从外部直接访问类中数据,那么,处理日志信息的代码就要写在每个类里,这样,造成的后果是每个类都要记录自己的信息,都与日志模块耦合在了一起。这也是我们所不希望看到的。虽然当前的AOP技术不能完全解决日志分离的问题,我们仍然希望,把日志信息的记录集中在一,二个模块中,或者,几个“切面”中。
当然,我们可以使用Observer模式来解决这一问题,让日志记录与应用逻辑相对的解耦,然而,Observer模式太过重型,你总不希望写每个类的时候都要来实现一下Observer模式把。
同时,在此提出新的问题,软件的正常运行,需要监控其稳定性,性能等指标。这就需要我们提供相应的接口来记录这些信息。这些信息与日志信息的情况相同,在整个系统中广泛存在。同样存在着如何提供接口,如何记录的问题。
至此,这个问题还处在迷茫中,准备读几个开源项目的源码,看看大家都是怎么处理这一问题的,希望能有说收获。