前言
类似于JDBC + 数据库驱动(统一接口+实现类),日志也可以采取这种方式实现,SpringBoot默认的日志实现是使用slf4j+logback,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉
一、常用日志框架
市面上常见的日志框架有:JUL , JCL , Jboss-logging , logback , log4j , log4j2 , slf4j等等,他们的分类如下:
日志门面(日志的抽象层) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) , SLF4J(Simple Logging Facade for Java), Jboss-logging | Log4j , JUL(java.util.logging ) , Log4j2, Logback |
SpringBoot默认的日志实现是使用slf4j+logback,slf4j叫做日志门面,是一个统一的日志接口层,logback来做日志实现。
二、Sprigboot日志实现原理
1、基本原理
下图是使用slf4j如何实现各种日志框架,需要导入的包:
可以看到,只引入slf4j是不能够实现日志记录的,还需要引入slf4j-api.jar或者slf4j-nop.jar;
如果实现使用logback日志框架,需要引入logback-core.jar和logback-classic.jar;
如果实现使用log4j日志框架,需要引入slf4j-log412.jar(log4j适配slf4j的jar),log4j.jar。其他情况类似。
每一个日志实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件。比如实现框架选用logback,那么配置文件就写logback.xml这种,实现框架选log4j,那么配置问价就选log4j.xml这种。
2、框架整合
但是在实际项目中,我们所引入的不同框架的底层日志框架是不一样的。比如:
Spring使用JCL,Hibernate使用Jboss等等,我们就需要统一日志记录,让不同的框架统一使用slf4j进行输出,这样我们就不用写别的配置文件,统一使用logback进行配置。具体做法如下图:
如上图,比如Spring框架,为了达到上述目标,我们需要排除掉Spring底层的commons-logging包,(不引入Spring会报包找不到的错误)然后引入包装层jcl-over-slf4j,这个包装层jar的包路径,类名等都采用commons-logging的形式进行配置,但是底层实现是slf4j,最后添加logback的jar包。
统一日志记录的思路(SpringBoot实现统一日志记录为slf4j的做法):
1.先排除掉其他日志框架
2.然后用中间包来替换排除掉的日志框架(外表一样,内部变了)
3.最后再添加目标日志框架
SpringBoot引入新框架需注意
当SpringBoot引入新框架的时候,如果此框架使用了JUL,JCL,或者log4j,这个时候我们应该排除掉原来的日志框架,避免因为现在SpringBoot中存在相同的日志实现而造成jar包冲突冲突。
3、默认实现
SpringBoot默认的日志实现是使用slf4j+logback
如上图:
1.SpringBoot默认的日志实现是使用slf4j+logback
2.SpringBoot把其他日志(log4j2,jul)转化为slf4j
三、Sprigboot日志的使用与配置
1、使用日志
创建一个日志记录器,就可以输出日志,日志有五个级别
//日志记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
//日志级别,由低到高
//可以调整输出级别,在applicatin.properties文件中调整
logger.trace("这是trace日志");
logger.debug("这是debug日志");
//springboot默认info级别,root级别,日志只会在整个级别的以后级别生效
logger.info("这是info日志");
logger.warn("这是warn日志");
logger.error("这是error日志");
}
输出结果
2020-09-25 17:26:13.117 INFO 7428 --- [ main] com.sxt.springboot.ApplicationTests : 这是info日志
2020-09-25 17:26:13.118 WARN 7428 --- [ main] com.sxt.springboot.ApplicationTests : 这是warn日志
2020-09-25 17:26:13.118 ERROR 7428 --- [ main] com.sxt.springboot.ApplicationTests : 这是error日志
2、配置
级别控制
所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中),SpringBoot默认是info级别(rootjibie)
格式为:‘logging.level.* = LEVEL’
logging.level:日志级别控制前缀,*为包名或Logger名
LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF(由低到高)
只有这个级别以及更高级别才会生效
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
输出日志文件
默认情况下,Spring引导只记录到控制台,不写入日志文件。如果你想写日志文件除了控制台输出之外,还需要设置logging.file.name或logging.file.path属性(用于例如,在您的application.properties中)。
logging.file.name,设置文件,可以是绝对路径,也可以是相对路径(当前项目下)。如:logging.file.name=/my.log
或者logging.file.name=G:/my.log
logging.file.path,设置目录,会在当前项目根目录下创建spring.log文件,并写入日志内容,如:logging.file.path=/var/log
注:二者不能同时使用,如若同时使用,则只有`logging.file.name生效
默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO
日志格式
日志包含输出以下信息:
–日期和时间:毫秒精度,易于排序。
–日志级别:错误、警告、信息、调试或跟踪。
–线程ID。
–A—分隔符,用于区分实际日志消息的开始。
–线程名称:括在方括号中(可能会因控制台输出而被截断)。
–log名称:这通常是源类名(通常缩写)。
–日志消息。
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 在文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
自定义日志配置
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项,logback-spring.xml中可以使用springProfile配置。
默认的命名规则,并且放在 src/main/resources 下面即可
如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字:
logging.config=classpath:logging-config.xml