日志框架漫谈
Java平台下存在很多日志框架,比如JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback,SLF4j,jboss-logging等。
java平台下日志框架的发展,经历了具体的日志实现,后来发展为日志门面+日志实现。
java日志
当我们在开发的时候,应该使用日志门面提供的api,而不是直接使用具体的日志实现。
打个比方,如果我们使用slf4j+log4j这套组合,那么配置提供log4j的配置(比如log4j.xml),使用slf4j提供的日志api即可;也就是说,每个日志实现框架都有自己的日志配置文件,即便使用日志门面后,依然要提供各自的配置文件。(也就是日志门面只是实现了api的适配,而没有进行日志配置的统一规范)
当前最流行的日志门面是slf4j了,我们就以这个为例来具体分析下,主要进行2点分析:
第一:slf4j是如何对各个日志实现进行适配?
第二:如何在项目中进行日志的统一使用?
slf4j+logback
slf4j+log4j
上面2个图分别是:slf4j+logback和slf4j+log4j这2套日志组合的方式图解说明。
首先,我们来说第一个问题,sl4j如何和其他日志实现框架适配的问题。
很简单,我们只需要看图中的左侧部分,提供相应的jar即可(有的除了具体的日志实现外,还需要提供额外的适配jar包)。
其次,我们要注意一个问题,由于在项目开发中,不可避免需要引入其他依赖,比如Spring默认使用的是commons-logging(即JCL),而Hibernate默认使用的是jboss-logging,那么问题就来了,我们如何统一日志记录的方式?
上图中的右侧部分就揭示了方法,打个比方,如果我们依赖Spring,虽然Spring默认使用的是JCL,要想在项目中统一使用slf4j+logback的话,很简单,我们先排除掉 JCL的依赖,然后再引入jcl-over-slf4j.jar的依赖即可。(其实就是在偷梁换柱,jcl-over-slf4j.jar和JCL在包名/类名/方法名上完全一致,只不过jcl-over-slf4j在内部调用的是slf4j的api而已,这样既可以避免Spring报错,又可以将Spring日志记录方式加以改变!)
看SpringBoot如何对日志进行统一处理
SpringBoot能自动适配所有的日志,而且底层使用的是slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。
SpringBoot很聪明,它已经把一些日志适配依赖都引入进来了,下面我们具体分析。
springboot日志依赖
我想通过上图的日志依赖关系,你就会明白springboot的良苦用心了!
上文说过Spring默认的日志依赖是JCL,而SpringBoot肯定是依赖Spring的,根据上文理论,自然是需要排除掉JCL的依赖的,我们来看下面的:
springboot依赖spring
spring已经排除掉JCL依赖
SpringBoot日志使用
关于SpringBoot日志的使用上,主要指出下面几点:
第一:全局的一些常用配置,如格式/路径/级别
第二:使用@Slf4j来进行日志处理
第三:日志的profile功能
第四:切换日志框架
在application.properties中进行日志配置
指定日志配置文件路径 logging.config=classpath:logback.xml
采用logging.path的方式指定日志路径
指定日志级别,要么在application.properties中直接指定:
logging.level.x.y.z=info
要么在logback.xml中配置。
关于日志的具体配置,这里不详细介绍,网上有很多资料大家可以参考。
日志的具体使用,相信大家很清楚,基本上就是先得到log对象:
private final Logger logger = LoggerFactory.getLogger(XXX.class);
不过为了简化,lombok给我们提供了注解进行日志输出。(需要idea有lombok的插件,还有需要lombok的依赖)
lombok支持
提供注解,直接使用log
下面我们再来简单谈一下日志的profile功能,要想支持profile功能也很简单,比如不要在叫logback.xml,而是logback-spring.xml,这样日志配置将由springboot来进行处理,就可以使用到profile功能。
logback-spring.xml
最后,我们再说一下,如果不想使用springboot默认支持的slf4j+logback的方式,而是slf4j+xxx呢?
很简单,根据上文理论,第一,排除依赖(logback);第二,加入依赖(log4j);第三,加入具体日志配置即可(log4j.xml)。
结束语
好了,到这里,我们就以SpringBoot为切入点,对整个Java平台的日志进行了一个分析,相信以后在开发过程中遇到日志的有关问题,能够心中有数~
作者:张丰哲
链接:https://www.jianshu.com/p/127d3201921b