作为程序员,程序开发写代码一定少不了记录日志(没日志的代码都是耍流氓!)今天记录一下自己新搭建spring-boot项目后对日志的思考。
起因:项目是一个无页面,通过直接访问数据库,然后调用第三方api实现数据上传的简单应用。因为项目很小,所以在项目完成后,为了使jar包的大小更小(强迫症,想把无用的maven引用全部去掉),所以打包完成后对lib下的jar包进行查看,发现关于log的jar包很多,由此引发联想,难道一个简单的日志都要用这么多的jar包吗?
查看自己的代码,发现只用到了如下代码
先说结论
-
commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者自由选择。log4j和logback则是具体的日志实现方案。这是典型的门面模式
-
比较常用的搭配是commons-logging+log4j,slf4j+logback
spring默认使用commons-logging+log4j
spring-boot默认使用slf4j+logback
-
SLF4J是编译时绑定到具体的日志框架,性能优于采用运行时搜寻的方式的commons-logging
-
不需要使用logger.isDebugEnabled()来解决日志因为字符拼接产生的性能问题
-
logger.info("my name is {}", "medusar"); logger.info("my name is " + "medusar");
在效率上,第一行比第二行更高,因为如果当前日志级别是ERROR,第一行不会进行字符串拼接,而第二行,无论日志级别是什么,都会先进行字符串拼接。
-
所以为了解决这个问题,commons-logging等框架提供了下面的方式:
if (log.isDebugEnabled()){ log.debug("dddd"+"eee"); }
-
所以说,现在使用spring-boot开发,已经不需要再使用log.isDebugEnabled()来判断debug了
下面我们顺藤摸瓜开始今天的寻根之旅!
先看下slf4j的实现
配合第一张图,可知:
-
可单独只使用slf4j
-
logback就是默认slf4j的实现(logback-classic.jar,logback-core.jarÿ