springboot核心技术之日志管理(三)

  • Post author:
  • Post category:其他


一、常见的日志框架

常见日志框架: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最全日志配置详解



版权声明:本文为weixin_43054590原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。