1. 简述

Spring Boot支持java.util.loggingLog4jLogback等作为日志框架,其中,Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。

1.1 日志框架

常见的日志框架: JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....

日志(接口层) 日志实现
JCL(Jakarta Commons Logging): 最后一次更新是2014年
SLF4j(Simple Logging Facade for Java)
jboss-logging: 使用场景少
Log4j JUL(java.util.logging) Log4j2 Logback

推荐使用日志接口: SLF4j; 推荐使用日志实现层: Logback,SpringBoot默认也是使用SLF4J+Logback

2. Logback介绍

2.1 组成成员

Logback日志框架(官网地址:https://logback.qos.ch/)是由`SLF4J`作者开发的新一代日志框架,用于替代`log4j`。它效率更高、能够适应诸多的运行环境。`Logback`的架构设计足够通用,可适用于不同的环境。目前`Logback`分为三个模块:`lobback-core`、`logback-classic`和`logback-access`,描述如下:

  • logback-core: 属于Logback的基础模块,是其他两个模块的基础。
  • logback-classic: 可以看作Log4j的改进版本,同时logback-classic自身实现了SLF4J API,使开发者可以在Logback框架与其他日志框架(如Log4jjava.util.logging)之间自由切换。
  • logback-access: 与Servlet容器(如TomcatJetty)集成,以提供HTTP访问日志功能。

2.2 日志级别

Logback的日志级别有: trace、debug、info、warn、error

级别排序为:trace <debug <info < warn < error

2.3 依赖引入

一般情况下,我们不需要单独引入spring-boot-starter-logging这个依赖了,因为这是spring-boot-starter默认引入的依赖其依赖如下:

image-20201020180236532

从上面的依赖树,我们可以看出,spring-boot-starter-logging依赖logback-classic, logback-classic依赖logback-core、sl4j-api

3. 在SpringBoot中使用

3.1 基于记录器使用

package com.hui.logdemo;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class LogDemoApplicationTests {
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
logger.trace("这是 trace 类型日志... {}","trace");
logger.debug("这是 debug 类型日志... {}","debug");
logger.info("这是 info 类型日志... {}","info");
logger.warn("这是 warn 类型日志... {}","warn");
logger.error("这是 error 类型日志... {}","error");
}
}

运行输出:

image-20201021141235936

原因:SpringBoot默认使用info级别。

解决方法: 通过logging.level设置;如下面配置

# 需要设置具体那个包,使用日志的级别
logging.level.com.hui.logdemo = trace

3.2 基于注解使用

如果每一个类都需要初始化一个Logger(记录器),不但会觉得很烦也会让别人觉得自己很low,幸好有个第三方插件(lombok)可以帮助我们做这些事,只需要使用lombok的@Slf4j注解即可。

1. 引入lombok

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
</dependency>

2. 使用

package com.hui.logdemo;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j
class LogDemoApplicationTests {
@Test
void contextLoads() {
log.trace("这是 trace 类型日志... {}","trace");
log.debug("这是 debug 类型日志... {}","debug");
log.info("这是 info 类型日志... {}","info");
log.warn("这是 warn 类型日志... {}","warn");
log.error("这是 error 类型日志... {}","error");
}
}

4.写入文件

默认情况下,Spring Boot只会将日志消息打印到控制台,并不会将日志写入日志文件。但是在实际项目中,一定会需要日志文件来分析程序。其实在Spring Boot工程中,想要输出控制台之外的日志文件很简单,只需要在application.properties文件或application.yml文件内设置logging.file.pathlogging.file.name属性即可。

从SpringBoot2.2版本以后,logging.path 重命名为: logging.file.path ;logging.file 重命名为: logging.file.name

4.1 写入文件配置

  • logging.file.name : 设置日志文件,这里可以设置文件的绝对路径,也可以设置文件的相对路径,具体可以根据情况设置,如logging.file.name=test.log
  • logging.file.path: 设置日志目录,在设置好目录后,会在设置目录文件夹下创建一个spring.log,如设置logging.file.path=/Users/liuqh
logging.file.name logging.file.path Example Description
(none) (none) 只在控制台输出
指定文件名 (none) my.log 输出日志到my.log文件
(none) 指定目录 /var/log 输出到指定目录的 spring.log 文件中

上述两个属性中,如果只设置一个,那么Spring Boot应用会默认读取该配置;如果同时设置,那么只有logging.file.name会生效。

5. 输出格式

5.1 输出格式语法

%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

# 示例
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

5.2 基于SpringBoot配置

# 设置控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} %msg%n