SpringBoot日志系统设置

SpringBoot日志系统、其他日志实现的整合。

日志系统主要概念

在Spring Boot中,日志门面和日志实现之间存在一种桥接机制。

日志门面

日志门面是一个抽象的接口层,提供了记录日志事件的一些规范和方法定义,开发者可以通过它来记录日志。日志门面接口是用来描述Java应用程序如何从代码中记录日志事件的API,它提供了统一的接口让开发人员在应用程序中记录日志,从而使得开发者可以更加方便地切换不同的日志框架。而具体使用哪个日志实现则是由开发者自己选择并配置的。

Spring Boot默认使用SLF4J(Simple Logging Facade for Java)作为日志门面,在代码中使用SLF4J提供的API来记录日志。SLF4J定义了一组接口用于发送日志消息,例如debug()、info()、error()等方法。

日志实现

日志实现则是具体实现这些方法的代码库,负责将记录下来的日志信息输出到对应的地方(如控制台、文件、数据库等)。在Spring Boot中,我们可以通过添加相应的依赖来选择需要使用的日志实现(如:Logback、Log4j2等)。这些依赖会提供一个对应的实现类库来按照SLF4J定义规范实现具体的日志输出。

因此,在编写代码时,我们只需要引入Spring Boot提供的相关依赖,并通过SLF4J API调用相关方法即可,无需关心底层的具体实现。而在运行时,则将根据项目所引入的依赖来确定具体使用哪种底层的日志实现。

SpringBoot日志使用

使用默认日志系统

SpringBoot默认使用的是Slf4j作为日志门面,Logback作为日志实现。

所以我们如果需要打印日志,可以创建项目后什么都不干,直接创建对象并调用方法,像这样:

1
2
3
4
//注意我们需要导入的是slf4j的Logger
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

1
2
3
4
5
6
@RequestMapping("/login")
public String login(){
Logger logger = LoggerFactory.getLogger(MainController.class);
logger.info("用户访问了一次登陆界面");
return "login";
}

因为我们使用了Lombok,所以直接一个注解也可以搞定:

1
2
3
4
5
6
7
8
9
@Slf4j
@Controller
public class MainController {

@RequestMapping("/login")
public String login(){
log.info("用户访问了一次登陆界面");l
return "login";
}

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,SpringBoot默认只会打印INFO以上级别的信息。

整合log4j

要使用Log4j在Spring Boot项目中记录日志执行以下步骤:

  1. 在pom.xml文件中添加Log4j依赖。
1
2
3
4
5
6
<!-- Log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-spring-boot-starter</artifactId>
<version>2.17.1</version>
</dependency>
  1. 创建log4j.properties或log4j.xml文件来配置日志记录。

在src/main/resources目录下创建一个名为log4j.properties或者log4j.xml的文件。以下是一个简单的配置示例:

1
2
3
4
5
6
7
8
9
#设置根logger的级别为info
log4j.rootLogger=INFO,stdout

#控制台输出的appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#控制台输出的layout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p] %d %c - %m%n
  1. 使用Logger对象记录日志。

在Java类中,可以通过以下方式获取Logger对象:

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

public class DemoClass {
private static final Logger logger = LoggerFactory.getLogger(DemoClass.class);
}

然后,您可以使用Logger对象记录日志,如下所示:

1
2
logger.info("This is an info message.");
logger.error("This is an error message.", exception);

整合log4j2

在 Spring Boot 中,我们可以通过配置文件的方式来指定使用哪种日志系统。如果要使用 Log4j2 作为日志系统,可以按照以下步骤进行配置:

  1. 在 pom.xml 文件中添加 log4j2 的依赖,例如:
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
  1. 在 resources 目录下创建 log4j2.xml 配置文件,并按照需要指定日志输出目录、日志级别、格式等相关信息。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>

<RollingFile name="RollingFile"
fileName="/var/log/myapp.log"
filePattern="/var/log/myapp-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>

<Loggers>
<Logger name="com.example" level="debug" additivity="false">
<AppenderRef ref="RollingFile"/>
</Logger>

<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

以上配置将日志输出到 /var/log/myapp.log 文件中,并在控制台输出 info 级别及以上的日志信息。

  1. 在 application.properties 或 application.yml 配置文件中指定 Spring Boot 使用 Log4j2 作为日志系统,例如:
1
2
3
4
5
6
# application.properties
logging.config=classpath:log4j2.xml

# application.yml
logging:
config: classpath:log4j2.xml

通过以上配置,Spring Boot 就会自动加载 log4j2.xml 配置文件并使用 Log4j2 作为日志系统。我们还可以通过 LoggerFactory 来获取 Logger 实例来进行日志输出,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class MyController {

private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);

@GetMapping("/")
public String index() {
LOGGER.info("访问了首页");
return "Hello World!";
}
}

SpringBoot日志系统设置
http://wahoyu.xyz/2023/03/15/SpringBootLogger/
作者
Wahoyu
发布于
2023年3月15日
许可协议