天天看点

转换成slf4j开发时统一日志解决日志遗留问题解析

在应用开发时如让日志服务统一

—日志统一是为了解决开发中日志遗留问题

应用在开发的时候,大部分都使用了框架,框架的底层我们一般是不会去改动的,框架底层都有自己的一套日志实现,这样就会造成日志遗留问题。举例

我开发系统A我想使用slf4j+logback,首先我们要对slf4j有个基本概念,**slf4j是定义了一套接口是一个日志抽象层,可以实现在多个日志系统之间快速切换,所以我们这次举例使用的logback不是固定的,你可以选择log4j或者其他日志实现。**回归正题,项目A我可能要在项目中使用Spring框架、或Hibernate等其他框架,这些框架底层都用到了日志,而且各不相同,这就造成了应用开发的时候日志服务不统一,就拿我刚才说的两个框架举例,他们底层使用的日志

  • Spring(commons-logging)统称JCL(下面就拿JCL举例)
  • Hibernate(jboss-logging)

而我的需要统一日志,让框架排除自带日志依赖使用slf4j,首先要替换掉框架原有的日志依赖,但这类框架直接删除依赖然会导致报错(因为Spring底层代码很多地方都调用了JCL)导致项目无法运行,这个时候我们必须要在不改变包名类名的情况下对源码进行更换,就是所谓的“偷梁换柱“,实现这些功能的就是适配器,举个例子我们需要对Spring框架底层的JCL日志服务进行统一,使JCL转换成slf4j,但是你强行把他依赖删除然后硬塞slf4j进去肯定是不行,毕竟类名包名内部方法全都不一样,是两个完全不相关的依赖,这时候需要用到的就是适配器,下图是日志适配器依赖org.slf4j:jcl-over-slf4j:1.x.x 的一个jar包或依赖,我们顾名思义都大概能看懂这个jar包所实现的功能,就是让JCL日志转换成slf4j日志,实现方式就是我上面说的“偷梁换柱”,在不改变包名类名的前提下把源码替换掉了,如下图

我们发现这个适配器完全保留了JCL日志内部的包名和类名,仅仅是修改了里面的源码,使用slf4j替换实现。

转换成slf4j开发时统一日志解决日志遗留问题解析

这幅图应该能更直白的表现适配器的作用。

转换成slf4j开发时统一日志解决日志遗留问题解析

通过日志服务适配器统一使用同一个日志抽象层,之后选择一个日志实现,这里我选择的日志实现是logback,当然你也可以选择log4j,log4j2,jul进行实现,这样风格就可以统一了,举一反三,Java很多地方都实现了类似的逻辑。