美文网首页程序员Spring BootSpringBoot极简教程 · Spring Boot
【SpringBoot专题】Java平台下日志的那些事

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

作者: 张丰哲 | 来源:发表于2018-08-18 12:08 被阅读161次

    前言

    《【SpringBoot专题】快速体验》

    《【SpringBoot专题】多环境配置及swagger》

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

    create by zhangfengzhe

    2018-08-18

    相关文章

      网友评论

        本文标题:【SpringBoot专题】Java平台下日志的那些事

        本文链接:https://www.haomeiwen.com/subject/yujmbftx.html