一、常见的日志框架
常见日志框架:JUL、JCL、Log4j、Log4j2,Logback、SLF4j、Jboss-logging
日志门面(日志的抽象) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
企业级开发日志选择:
日志门面:SLF4j;
日志实现:Log4j、Logback;
Log4j2功能非常强大,但是设计比较复杂并且没有日志门面与之相匹配,作为企业级日志会存在不稳定的问题;
日志选择逻辑:日志门面+日志实现,运行日志时调用的是日志门面的接口,但是配置采用的是日志实现的配置。
springboot日志选择:spring框架默认采用的是JCL日志门面,所以springboot底层默认排除了spring框架采用的JCL
日志门面:SLF4j;
日志实现:Logback;它相对于Log4j来说更加的强大功能更加齐全。
二、日志门面+日志实现依赖包组合选择
1、经典依赖包组合图
SLF4j:只导入SLF4j的jar包,没有实现日志,日志功能单一
SLF4j+Logback:导入slf4j-api.jar和Logback相关jar包
SLF4j+Log4j:导入slf4j-api.jar、slf4j-log412.jar、log4j.jar三个jar包
SLF4j+JUL:导入slf4j-api.jar、slf4j-jdk14.jar、JUL相关jar包
SLF4j+slf4j-simple:导入slf4j-api.jar、slf4j-simple.jar
注意:1)SLF4j+Log4j相对于SLF4j+Logback多了一个jar包,多的这个slf4j-log412.jar是用来适配SLF4j和Log4j并整合它们;
2)每一个日志实现框架都有自己的配置文件,当选择好日志门面+日志实现依赖包组合后,日志最终以日志实现框架的配置来实现日志的相应功能。
2、统一日志框架
问题:springboot导入其它框架时其它框架自带了日志框架,这时我们需要将工程内所有框架的日志框架进行统一,使用springboot默认的日志框架。
常用框架自带日志:spring(Commons-logging)、Hibernate(Jboss-logging)、。。。。。
解决流程图如下:
统一日志的逻辑:1)先将引入框架的默认依赖包排除掉,如spring要排除Commons-logging的jar包;
2)再使用中间包取代原先的默认日志,如果不使用中间包则日志打印会出错;
3)导入 SLF4j的实现日志。
中间包替换表格:
要排除的默认日志框架 | 中间日志框架 |
---|---|
JCL(Jakarta Commons Logging) | jcl-over-slf4j.jar |
log4j API | log4j-over-slf4j.jar |
JUL(java.util.logging) | jul-to-slf4j.jar |
三、springboot 日志关系
1、springboot底层日志依赖关系
spring-boot-starter:默认实现了spring-boot-starter-logging依赖,spring-boot-starter-logging用来管理springboot的日志实现;如上图所示,我们可以看到spring-boot-starter-logging又默认实现了jul-to-slf4j、log4j-over-slf4j、jcl-over-slf4j三个中间日志jar包以及Logback核心日志包;这四个日志jar包又继承了slf4j-api.jar日志门面。
springboot统一日志框架:1)其它框架排除自身默认框架,如spring要排除Commons-logging的jar包;
2)因为spring-boot-starter-logging默认实现了jul-to-slf4j、log4j-over-slf4j、jcl-over-slf4j三个 中间日志jar包,所以springboot会自动集成slf4j-api和Logback以及中间层日志包,这样其 它的框架如Mybatis的日志框架也就与工程默认日志框架同步了:slf4j-api + Logback
思考:springboot底层默认排除了spring的日志框架,所以springboot的日志框架组合默认是: slf4j-api + Logback
如下是spring-core的依赖:默认排除了spring的日志框架
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2、总结:springboot统一日志只需要将引入依赖包默认的日志框架排除即可
四、springboot默认日志配置
1、默认配置内容:日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL;Spring Boot中默认配置ERROR
、WARN
和INFO
级别的日志输出到控制台;日志默认输出在控制台,日志输出内容springboot底层已配置好,开箱即用。
2、application.properties文件中配置日志属性
logging.level.* : 作为package(包)的前缀来设置日志级别;日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL
logging.file :配置日志输出的文件名,也可以配置文件名的绝对路径。
logging.path :配置日志的路径。如果没有配置logging.file,Spring Boot 将默认使用spring.log作为文件名;当logging.file与logging.path同时存在时,springboot按照logging.file定义的路径输出日志文件
logging.pattern.console :定义console中logging的样式。
logging.pattern.file :定义文件中日志的样式。
logging.pattern.level :定义渲染不同级别日志的格式。默认是%5p.
logging.exception-conversion-word :.定义当日志发生异常时的转换字
PID :定义当前进程的ID
3、根据不同的日志系统,springboot中你可以按如下规则组织配置文件名,就能被正确加载:
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
4、引入自定义的logback.xml文件,在properties文件夹中进行如下声明
logging.config=classpath:logging-test.xml
5、springboot集成log4j:
方式一:
第一步:将log4j对应的中间日志框架log4j-over-slf4j.jar依赖清除掉;
第二步:将logback的依赖清除掉;
第三步:引入log4j及其适配层日志框架的依赖,最后log4j就能成功运行了。
方式二:
第一步:移除spring-boot-starter-logging依赖包;
第二步:添加spring-boot-starter-log4j依赖包,ok。
6、springboot的logback.xml配置内容:如果我们觉得springboot默认的配置内容满足不了我们的需求,我们也可以自定义logback日志的xml对logback日志进行重新配置;
7、自定义logback.xml:springboot会自动加载此文件,详情请见本节中的第3小节
注意:springboot官方推荐使用logback-spring.xml,相对于
logback.xml它的配置功能更加齐全,比如logback-spring.xml可以配置profile多环境日志,logback.xml则不能实现此功能
8、logback.xml语法结构请参考此博客:springboot最全日志配置详解