【SpringBoot专题】之Java平台下日志的那些事

148 阅读4分钟

本篇是【SpringBoot专题】系列的第三篇,将介绍SpringBoot对日志的支持,讲解Java平台下日志的那些事,彻底揭开日志框架在使用过程中的那些坑~

 

日志框架漫谈

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平台的日志进行了一个分析,相信以后在开发过程中遇到日志的有关问题,能够心中有数~