SpringBoot日志框架

489 阅读3分钟

Spring Boot 可以自动的适配日志框架,底层使用 SLF4j + LogBack 记录日志,如果我们自行引入其他框架,需要排除其日志框架。

一. 日志是由一个抽象层+实现层的组合来搭建的

日志-抽象层日志-实现层
JCL(Jakarta Commons Logging)、SLF4J(Simple Logging Facade for Java)、jboss-loggingjul(java.util.logging)、log4j、logback、log4j2

Spring 框架默认选择使用 JCL 。而 Spring Boot 默认选择 SLF4J 结合 LogBack;

二. 统一日志框架的使用

一般情况下,在项目中存在着各种不同的第三方 jar ,且它们的日志选择也可能不尽相同,想为项目设置统一的日志框架,可以使用一种和要替换的日志框架类完全一样的 jar 进行替换,这样不至于原来的第三方 jar 报错,而这个替换的 jar 其实使用了 SLF4J API. 这样项目中的日志就都可以通过 SLF4J API 结合自己选择的框架进行日志输出。

统一日志框架使用步骤归纳如下:

1. 排除系统中的其他日志框架。
2. 使用中间包替换要替换的日志框架。
3. 导入我们选择的 SLF4J 实现。`

三. SpringBoot日志使用原理

(1)排除其他日志框架

在 Spring Boot 的 Maven 依赖里可以清楚的看到 Spring Boot 排除了其他日志框架。我们自行排除依赖时候按照下列方式可以进行。

<exclusions>
    <exclusion>
        <artifactId>commons-logging</artifactId>
        <groupId>commons-logging</groupId>
    </exclusion>
</exclusions>

(2)统一框架引入替换包

Spring Boot 是使用了 SLF4J+logback 的日志框架组合,查看 Spring Boot 项目的 Maven 依赖关系可 以看到 Spring Boot 的核心启动器 spring-boot-starter 引入了 spring-boot-starter-logging

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>2.4.0.RELEASE</version>
</dependency>

而 spring-boot-starter-logging 的 Maven 依赖主要引入了 logback-classic (包含了日志框架 Logback 的实现),log4j-to-slf4j (在 log4j 日志框架作者开发此框架的时候还没有想到使用日志抽象层进行开 发,因此出现了 log4j 向 slf4j 转换的工具),jul-to-slf4j ( Java 自带的日志框架转换为 slf4j).

<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.13.3</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>1.7.30</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

四. SpringBoot日志级别和格式

(1)Spring Boot 默认已经使用了 SLF4J + LogBack,我们在不进行任何额外操作的情况下就可以使用 SLF4J + Logback 进行日志输

(2)日志级别从小到大为 trace < debug < info < warn < error . SpringBoot 默认日志级别为 INFO

(3)Spring Boot 默认日志格式是

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
# %thread 线程名称
# %-5level 日志级别从左显示5个字符宽度
# %logger{50} 类名
# %msg%n 日志信息加换行

(4)可以在配置文件中编写日志相关配置

# 指定具体包的日志级别
logging.level.com.lagou=debug
# 控制台和日志文件输出格式
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
# 日志输出路径,默认文件spring.log
logging.file.path=spring.log
#logging.file.name=log.log