SpringBoot-日志

日志框架和选择

介绍

在进行大型项目的开发时。如果日志的文件记录的分散或者凌乱进行分散输出或者记录,不利于项目的日志管理

(1)日志应该进行统一的管理和配置->使用框架的方式对日志进行统一管理

(2)使用面向接口的编程方式对框架进行使用,项目中具体日志实现即可(类似JDBC)

市面上的日志框架

(1)市场上存在非常多的日志框架。JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等

(2)Spring Boot在框架内容部使用JCL,spring-boot-starter-logging采用了 slf4j+logback的形式,Spring Boot也能自动适配(jul、log4j2、logback) 并 简化配置

Snipaste_2019-09-02_23-28-06

细节:

(1)日志门面:日志的抽象层

(2)左边选一个门面右边选择一个实现

(3)SpringBoot:底层是Spring框架,Spring框架默认是用JCL;‘

SpringBoot选用 SLF4j和logback;

SLF4j使用

如何在系统中使用SLF4j

在开发的时候,日志的记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层的里面的方法。

https://www.slf4j.org

给系统里面导入slf4j的jar和 logback的实现jar

1
2
3
4
5
6
7
8
9
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}

SLF4J的实现图示(上文提到时SLF4J的logback实现):

concrete-bindings

注意

(1)深蓝颜色为实现层、绿色为适配层

(2)每一个日志实现框架都有自己的配置文件,使用SLF4J之后,配置文件还是做成日志实现框架的配置文件

其他的日志框架转换为SLF4J

遗留问题

假设在开发的过程中如果开发了多个系统,那么系统中如果使用的框架不同那么他们用的日志记录框架也会有很大的差别。这时候每一个系统都有自己的日志记录框架,整合的时候就会出现日志框架杂乱,日志没有统一进行配置。

如何统一日志记录使得别的框架也是使用SLF4J进行日志输出

(1)将系统中其他日志框架先排除出去;

(2)用中间包来替换原有的日志框架;

(3)我们导入slf4j其他的实现

Snipaste_2019-09-07_14-44-43

SpringBoot日志关系

最基本的依赖(每一个启动器、场景都需要对其进行依赖)

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

Snipaste_2019-09-07_16-00-18

SpringBoot使用它来做日志功能;

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

底层依赖关系

搜狗截图20180131220946

总结:

1)SpringBoot底层也是使用slf4j+logback的方式进行日志记录

2)SpringBoot也把其他的日志都替换成了slf4j;

3)中间替换包?(调用的是原来日志框架的方法名但是在新建对象的时候使用的是SLF4J的方式进行实现)

中间转换包图示:

搜狗截图20180131221411

转换包底层实现原理

1
2
3
4
5
6
@SuppressWarnings("rawtypes")
public abstract class LogFactory {

static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";

static LogFactory logFactory = new SLF4JLogFactory();

4)SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志。

5)如果在开发的过程中需要引入其他的框架,那么一定要把引入的框架的日志依赖移除。原因是SpringBoot在底层的实现中已经存在和引入框架的同名转换包。这样就会引起冲突。

示例

Spring框架用的是commons-logging;

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

SpringBoot日志默认配置

(1)在没有对日志进行任何配置的时候,SpringBoot已经有了一个默认的配置。直接使用即可

实例

1)创建java文件、

​ 获取日志记录器并使用日志记录器将日志进行输出。

Snipaste_2019-09-07_16-11-01

2)更改配置文件

更改配置文件设置日志的级别(level后面跟的是包名),以及日志文件的输出路径

Snipaste_2019-09-07_16-39-30

3)日志输出格式设置

Snipaste_2019-09-07_16-50-03

日志输出格式:
    %d表示日期时间,
    %thread表示线程名,
    %-5level:级别从左显示5个字符宽度
    %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
    %msg:日志消息,
    %n是换行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

指定日志文件和日志Profile功能

如何指定属于自己编写的日志配置文件?

答:给类路径下放上每个日志框架自己的配置文件即可SpringBoot就不使用他默认配置了,而是直接使用日志框架的配置文件。如下图所示就是日志框架所对应的配置文件

Snipaste_2019-09-07_23-47-27

logback.xml:直接就被日志框架识别了;

带上Spring扩展名的框架

logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能,使得某段的配置内容在指定的环境下才能生效

1
2
3
4
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某个环境下生效
</springProfile>

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
</appender>

注意: 如果使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误

no applicable action for [springProfile]

切换日志框架

将使用中的SLF4j+logback替换成SLF4J+log4j进行使用

参考图

Snipaste_2019-09-08_00-54-47

(1)logback实现包依赖去除(pom.xml)

Snipaste_2019-09-08_00-21-59

(2)将log4j替换成slf4j的替换包移除依赖(里面的log4j都底层实现使用了受理费j)

Snipaste_2019-09-08_00-23-14

(3)将适配层依赖导入

Snipaste_2019-09-08_00-52-47

依赖图

Snipaste_2019-09-08_00-54-06

切换成log4j2

(1)将原有的logging排除

Snipaste_2019-09-08_00-59-44

(2)添加log4j2

Snipaste_2019-09-08_01-00-19

(3)使用默认配置文件(或指定配置文件对日志进行配置),下图为默认配置文件

Snipaste_2019-09-08_01-04-05